AT&T汇编指令总结

【搞懂 AT&T 汇编指令格式】源 → 目标,一篇就够! AT&T 语法中,操作数1(源),操作数2(目标)把立即数 1 放进 %eax 中你没看错,$1是源,%eax是目标!在 AT&T 汇编中,操作数顺序是源 → 目标,寄存器加,立即数加,后缀标明大小!理解这几个“奇怪”的规则后,写起 AT&T 汇编就能轻松不少啦🎉! 阅读详情

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的AT&T汇编指令与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;
    对应的AT&T语法的指令为cbtw,cwtl,cwtd,cltd。
7. 调用和跳转指令
        段内调用和跳转指令为"call","ret"和"jmp",段间调用和跳转指令为   
    为:"lcall","lret"和"ljmp"。
        段间调用和跳转指令的格式为“lcall/ljmp $SECTION, $OFFSET”,而段间返回指令则为
    “lret $STACK-ADJUST”。
8. 前缀
    操作码前缀被用在下列的情况:
        字符串重复操作指令(rep,repne);
        指定被操作的段(cs,ds,ss,es,fs,gs);
        进行总线加锁(lock);
        指定地址和操作的大小(data16,addr16);
    在AT&T汇编语法中,操作码前缀通常被单独放在一行,后面不跟任何操作数。例如,对于重复
    scas指令,其写法为:
             repne
             scas
    上述操作码前缀的意义和用法如下:
        指定被操作的段前缀为cs,ds,ss,es,fs,和gs。在AT&T语法中,只需要按照
    section:memory-operand的格式就指定了相应的段前缀。比如:lcall %:realmode_swtch
    操作数/地址大小
        前缀是“data16”和"addr16",它们被用来在32-bit操作数/地址代码中指定16-bit的操
    作数/地址。
        总线加锁前缀“lock”,它是为了在多处理器环境中,保证在当前指令执行期间禁止一切中
    断。这个前缀仅仅对ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,DEC, INC, NEG, NOT,
    OR, SBB, SUB, XOR, XADD,XCHG指令有效,如果将Lock前缀用在其它指令之前,将会引起异
    常。
        字符串重复操作前缀"rep","repe","repne"用来让字符串操作重复“%ecx”次。
9. 内存引用
    Intel语法的间接内存引用的格式为:
        section:[base+index*scale+displacement]
    而在AT&T语法中对应的形式为:
        section:displacement(base,index,scale)
    其中,base和index是任意的32-bit base和index寄存器。scale可以取值1,2,4,8。如果不
    指定scale值,则默认值为1。section可以指定任意的段寄存器作为段前缀,默认的段寄存器在
    不同的情况下不一样。如果你在指令中指定了默认的段前缀,则编译器在目标代码中不会产生此
    段前缀代码。
如果call和jump操作在操作数前指定前缀“*”,则表示是一个绝对地址调用/跳转,也就是说jmp/call指令指定的是一个绝对地址。如果没有指定"*",则操作数是一个相对地址。
任何指令如果其操作数是一个内存操作,则指令必须指定它的操作尺寸(byte,word,long),也就是说必须带有指令后缀(b,w,l)。

AT&T汇编语言手册2015 AT&T汇编语言文档很少,而且都是比较过时的版本。我这个是2015年出版的最新版本。x86版本。 立即下载

相关推荐

AT&T ASM 汇编语法(SUN)

x86 Assembly Language Reference Manual。SUN官方出品。学习AT&T汇编的好材料。

AT&T 汇编语言学习笔记

AT&T汇编语言基础学习笔记。实例代码解释声明指令的用法。

招财猫_Martin 的专栏 729

ATT.rar_ATT汇编_at_att_linux 汇编

AT&T汇编的比较详细的说明,区分了它X86汇编使用的不同之处,学习linux内核的一定要看看哦

AT&T汇编伪指令

 最近一直在看OS方面的东西,其中要用到许多AT&T汇编,下面是在网上打到的关于它的伪指令方面的中英文对照版本。英文版本也可以输入如下命令来查看:    info as        read the "Pseudo Ops" node7 Assembler DirectivesAll assembler directives have names that begin with a period

专注成就非凡 2182

AT&T汇编指令介绍

linux中使用的AT&T格式的汇编指令,所以总结一下一些比较重要的指令。 1.寻址模式 有多种不同的寻址模式,允许不同形式的存储器引用。我们用符号Ea表示任意寄存器,R[Ea]表示它的值。M[addr]表示addr处地址的值。 题目: 答案:0x100,0xAB,0x108,0xFF,0x11,0x12,0xFF,0x11。 2.leal指令 加载有效地址指令其实是m

GetnextWindow的专栏 2018

AT&T(GAS)汇编指令小集

AT&T(GAS)汇编指令小集 GAS中每个操作都是有一个字符的后缀,表明操作数的大小。 C声明 GAS后缀 大小(字节) char b 1 short w 2 (unsigned) int / long / char* l 4

Rain的专栏 2623

AT&T格式与Intel格式x86汇编指令的区别

这个公司的创始人就是发明电话的贝尔,而UnixC语言都是出自贝尔实验室的产物。

码明的博客 604

AT&T汇编指令

AT&T汇编指令 GAS中每个操作都是有一个字符的后缀,表明操作数的大小。 C声明 GAS后缀 大小(字节) char b 1 short w 2 (unsigned) int / long / char* l 4

Rain的专栏 7564

AT&T 汇编指令

AT&T指令集     GAS中每个操作都是有一个字符的后缀,表明操作数的大小。 C声明 GAS后缀 大小(字节) char b

春风得意,马蹄仍急;少年豪情,一笑难回。 1693

AT&T 汇编指令说明

在阅读linux/unix内核源代码的时候,必须先掌握汇编,大家都知道,内核代码用的编译器是gcc,而gcc采用的是AT&T汇编格式,与MS的intel有些区别。一 AT&T的基本语法语法上主要有以下几个不同. ★ 寄存器命名原则 AT&T: %eax Intel: eax ★ 源/目的操作数顺序 AT&T: movl %eax,%ebx Intel: mov ebx

Mr. li linux love 5379

AT&T汇编指令 AT&T汇编伪指令

<br /> 最近一直在看OS方面的东西,其中要用到许多AT&T汇编,下面是在网上打到的关于它的伪指令方面的中英文对照版本。英文版本也可以输入如下命令来查看:<br />     info as    <br />     read the "Pseudo Ops" node<br /><br /> 7 Assembler Directives<br /> All assembler directives have names that begin with a period (‘.’). The

hunwo的专栏 2847

at&t 汇编指令

由于学习linux内核需要学习asm汇编,在网络上找了两个附件,介绍at&t的asm语法gcc 内嵌编译的语法。 转载于:https://blog.51cto.com/herojames/264656...

weixin_33801856的博客 123

函数调用堆栈分析(32位系统,linux AT&T汇编指令

call: 将当前cs:eip的值(此时cs:eip执行call这条指令的。(TIPS: 早期编译器变量声明都要在函数开头,就是为了方便计算空间大小)ret: 从栈顶弹出原来保存在这里的cs:eip的值,放入cs:eip中。)压入栈顶,cs:eip指向被调用函数的入口地址。ebp: 基址指针(base pointer)enter //建立被调用者函数的堆栈框架。leave //拆除被调用者函数的堆栈框架。cs: eip总是指向下一条指令地址。其实就是在准备存储局部变量的空间。完,构建好函数框架之后,

markey1的博客 527
上一篇: 控制寄存器(CR0,CR1,CR2,CR3)
下一篇: 调试寄存器和测试寄存器
zmcomputer
博客等级 码龄17年 59粉丝 11原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值