ATamp;T汇编与GCC内嵌汇编语法.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ATT汇编与GCC内嵌汇编语法 来源: ChinaUnix博客  日期: 2006.07.17 09:34 (共有条评论) 我要评论 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 讨论ATT的汇编语法,以及GCC的内嵌汇编语法。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0.3.2 Syntax 1.寄存器引用 引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。 80386有如下寄存器: 8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp; 8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp; 8个8-bit寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl。它们事实上是寄存器%ax,%bx,%cx,%dx的高8位和低8位; 6个段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs; 3个控制寄存器:%cr0,%cr2,%cr3; 6个debug寄存器:%db0,%db1,%db2,%db3,%db6,%db7; 2个测试寄存器:%tr6,%tr7; 8个浮点寄存器栈:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)。 2. 操作数顺序 操作数排列是从源(左)到目的(右),如“movl %eax(源), %ebx(目的)” 3. 立即数 使用立即数,要在数前面加符号$, 如“movl $0x04, %ebx” 或者: para = 0x04 movl $para, %ebx 指令执行的结果是将立即数04h装入寄存器ebx。 4. 符号常数 符号常数直接引用 如 value: .long 0x12a3f2de movl value , %ebx 指令执行的结果是将常数0x12a3f2de装入寄存器ebx。 引用符号地址在符号前加符号$, 如“movl $value, % ebx”则是将符号value的地址装入寄存器ebx。 5. 操作数的长度 操作数的长度用加在指令后的符号表示b(byte, 8-bit), w(word, 16-bits), l(long, 32-bits),如“movb %al, %bl”,“movw %ax, %bx”,“movl %eax, %ebx ”。 如果没有指定操作数长度的话,编译器将按照目标操作数的长度来设置。比如指令“mov %ax, %bx”,由于目标操作数bx的长度为word,那么编译器将把此指令等同于“movw %ax, %bx”。同样道理,指令“mov $4, %ebx”等同于指令“movl $4, %ebx”,“push %al”等同于“pushb %al”。对于没有指定操作数长度,但编译器又无法猜测的指令,编译器将会报错,比如指令“push $4”。 6. 符号扩展和零扩展指令 绝大多数面向80386的ATT汇编指令与Intel格式的汇编指令都是相同的,符号扩展指令和零扩展指令则是仅有的不同格式指令。 符号扩展指令和零扩展指令需要指定源操作数长度和目的操作数长度,即使在某些指令中这些操作数是隐含的。 在AT T语法中,符号扩展和零扩展指令的格式为,基本部分movs和movz(对应Intel语法的movsx和movzx),后面跟上源操作数长度和 目的操作数长度。movsbl意味着movs (from)byte (to)long;movbw意味着movs (from)byte (to)word;movswl意味着movs (from)word (to)long。对于movz指令也一样。比如指令“movsbl %al, %edx”意味着将al寄存器的内容进行符号扩展后放置到edx寄存器中。 其它的Intel格式的符号扩展指令还有: cbw -- sign-extend byte in %al to word in %ax; cwde -- sign-extend word in %ax to long in %eax; cwd -- sign-extend word in %ax to long in %dx:%ax; cdq -- sign-extend dword in %eax to quad in %edx:%eax; 对应的ATT语法的指令为cbtw,cwtl,cwtd,cltd。 7

文档评论(0)

hshh + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档