- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《linux汇编》.pdf
ATT 汇编语言与GCC 内嵌汇编简介
版本 0.1
时间 04/3/30
EMA IL chforest_chang@
1 ATT 与 INTEL 的 编语言语法的区别3
1.1 大小写3
1.2 操作数赋值方向3
1.3 前缀3
1.4 间接寻址语法4
1.5 后缀4
1.6 指令5
2 GCC 内嵌汇编 5
2.1 简介5
2.2 内嵌汇编举例5
2.3 语法7
2.3.1 编语句模板7
2.3.2 输出部分7
2.3.3 输入部分8
2.3.4 限制字符8
2.3.5 破坏描述部分14
2.4 GCC 如何编译内嵌汇编代码19
3 后记20
本节先介绍ATT 编语言语法与 INTEL 编语法的差别,然后介绍GCC 内嵌汇编语法。
阅读本节需要读者具有 INTEL汇编语言基础。
1 ATT 与 INTEL 的汇编语言语法的区别
1.1 大小写
INTEL格式的指令使用大写字母,而ATT 格式的使用小写字母。
例:
INTEL ATT
MOV EAX,EBX movl %ebx,%eax
1.2 操作数赋值方向
在 INTEL 语法中,第一个表示目的操作数,第二个表示源操作数,赋值方向从右向左。
ATT 语法第一个为源操作数,第二个为目的操作数,方向从左 右,合乎自然。
例:
INTEL ATT
MOV EAX,EBX movl %ebx,%eax
1.3 前缀
在 INTEL 语法中寄存器和立即数不需要前缀;ATT 中寄存器需要加前缀 “%”;立即数
需要加前缀 “$”。
例:
INTEL ATT
MOV EAX,1 movl $1,%eax
符号常数直接引用,不需要加前缀,如:movl value , %ebx,value 为一常数;在符
号前加前缀$表示引用符号地址, 如movl $value, %ebx,是将value 的地址放 ebx 中。
总线锁定前缀“lock”:总线锁定操作。“lock”前缀在Linux 核心代码中使用很多,特
别是SMP 代码中。当总线锁定后其它CPU 不能存取锁定地址处的内存单元。
远程跳转指令和子过程调用指令的操作码使用前缀 “l “,分别为 ljmp,lcall,与之
相应的返回指令伪 lret。
例:
INTEL ATT
CALL FAR SECTION:OFFSET lcall $secion:$offset
JMP FAR SECTION:OFFSET ljmp $secion:$offset
RET FAR SATCK_ADJUST lret $stack_adjust
1.4 间接寻址语法
INTEL 中基地址使用 “[”、“]”,而在ATT 中使用“(”、“)”;另外处理复杂操作数的
语法 也 不同 , INTEL 为 Segreg:[base+index*scale+disp] , 而在 ATT 中为
%segreg:disp(base,index,sale),其中segreg,index,scale,disp 都是可选的,在指定
index而没有显式指定Scale 的情况下使用默认值1。Scale 和disp 不需要加前缀 “”。
INTEL ATT
Instr
文档评论(0)