- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ARM标准汇编与GNU汇编
ARM标准汇编与GNU汇编
前段时间看arm的汇编,发现很多有一个小点,但是借来的书上的语法却没有,问同学也不知道,于是在网上查了一番才发现我书上看到的是arm的标准汇编,而有小点的gnu的汇编,于是将收集到的资料整理后放到这里来。
GNU汇编语言结构?????????????????????????????????????????????????? 主要包括三个常用的段:???? data????? 数据段 声明带有初始值的元素???? bss?????? 数据段 声明使用0或者null初始化的元素???? text????? 正文段 包含的指令, 每个汇编程序都必须包含此段???????? 使用.section 指令定义段, 如:???? .section .data???? .section .bss???? .section .text???????? 起始点:???? gnu汇编器使用_start标签表示默认的起始点, 此外如果想要汇编内部的标签能够被外部程序访问,???? 需要使用.globl 指令, 如:.globl _start???????????? 使用通用库函数时可以使用:???? ld -dynamic-linker /lib/ld-linux.so.2
################################################################################################# 四, 数据传递?????????????????????????????????????????????################################################################################################??1, 数据段???? 使用.data声明数据段, 这个段中声明的任何数据元素都保留在内存中并可以被汇编程序的指令读取,???? 此外还可以使用.rodata声明只读的数据段, 在声明一个数据元素时, 需要使用标签和命令:???????? 标签:用做引用数据元素所使用的标记, 它和c语言的变量很相似, 它对于处理器是没有意义的, 它只是用做汇编器试图访问内存位置时用做引用指针的一个位置。???????? 指令:指示汇编器为通过标签引用的数据元素保留特定数量的内存, 声明命令之后必须给出一个或多个默认值。????????????? 声明指令:???? .ascii?? 文本字符串???? .asciz?? 以空字符结尾的字符串???? .byte??? 字节值???? .double 双精度浮点值???? .float?? 单精度浮点值???? .int???? 32位整数???? .long??? 32位整数, 和int相同???? .octa??? 16字节整数???? .quad??? 8字节整数???? .short?? 16位整数???? .single 单精度浮点数(和float相同)???????????? 例子:???? output:???? .ascii hello world.???????? pi:???? .float 2.14???????? 声明可以在一行中定义多个值, 如:???? ages:???? .int 20, 10, 30, 40???????????? 定义静态符号:???? 使用.equ命令把常量值定义为可以在文本段中使用的符号,如:???? .section .data???? .equ LINUX_SYS_CALL, 0x80???? .section .text???? movl $LINUX_SYS_CALL, %eax ????????????2, bss段??? 和data段不同, 无需声明特定的数据类型, 只需声明为所需目的保留的原始内存部分即可。??? GNU汇编器使用以下两个命令声明内存区域:??? .comm?????????? 声明为未初始化的通用内存区域??? .lcomm????????? 声明为未初始化的本地内存区域?????? 两种声明很相似, 但.lcomm是为不会从本地汇编代码之外进行访问的数据保留的, 格式为:??? .comm/.lcomm symbol, length?????? 例子:??? .section .bss??? .lcomm buffer, 1000??? 该语句把1000字节的内存地址赋予标签buffer, 在声明本地
文档评论(0)