ATT汇编基础

生成汇编指令,使用AT&T汇编

定义段空间 .section .data          有初值数据段 .section .bss             无初值数据段 .section .text           代码段   程序的开始和结束 .section .data a:     .int   4               定义变量a值为4 .section .bss          .lcomm    b,      2       定义变量b大小为2字节 .section .text .globl                _start                程序的开始 _start:          movl         $1,   %eax        程序的结束          movl         $0,   %ebx          int             $0x80   常量前要加$符号,寄存器前要加% 直接使用变量a,使用的是a的值;使用$a,使用的是a的地址   常用寄存器 32位通用寄存器:%eax, %ebx, %ecx, %edx 16位通用寄存器:%ax, %bx, %cx, %dx 8位通用寄存器:         %ah, %al, %bh, %bl, %ch, %cl, %dh, %dl 段寄存器:    cs, ds, ss, es, fs, gs(很少使用,不用修改) 段寄存器配对: cs:eip(代码段指针) ds:esi(数据段), es:edi, ss:esp(栈顶指针), ss:ebp(栈底指针)   数据类型 .ascii                 字符串 .short                短整型 16位2字节 .int .long          长整型 32位4字节 .byte                 一个字节 .float                浮点单精度 .double             浮点双精度 .comm              名称,长度       长度为字节大小,定义一个为初始化的变量放在bss中   寻址 base_address(offset_address, index, size) 得到地址为base_address + offset_address + index * size 例如 -4(%eax, %ebx, 2)         得到地址为 -4 + %eax + %ebx * 2 其中base_address可以为变量或者常量,offset_address和index必须为寄存器   常用指令

movb b表示一个字节
movw w表示2字节short型整数
movl l表示4字节long型整数

 

指令 指令格式 指令说明
movb, movw, movl movl 源,目的 源地址数据移动到目的地址
addb, addw, addl addl 源,目的 目的地址 = 目的地址 + 源地址
subb, subw, subl subl 源,目的 目的地址 = 目的地址 - 源地址
mulb, mulw, mull mull 源 8位,AX = AL * 源
16位,DX:AX = AX * 源
32位,EDX:EAX = EAX * 源
divb, divw, divl divl 源 8位,AL = AX / 源      AH = AX % 
16位,AX = DX:AX / 源   DX = DX:AX % 
32位,EAX = EDX:EAX / 源 EDX = EDX:EAX % 源
cmp cmp 源,目的 源和目的比较,后面接jz、jnz、ja、jb、jae、jbe
jz jz 目的代码 如果源和目的相等跳转
jnz jnz 目的代码 如果源和目的不相等跳转
ja ja 目的代码 目的 > 源
jb jb 目的代码 目的 < 源
jae jae 目的代码 目的 >= 源
jbe jbe 目的代码 目的 <= 源
pushw, pushl pushl 源 将源地址数据压栈
popw, popl popl 目的 将栈顶元素弹出到目的地址

  浮点数运算 浮点数运算使用8个专用寄存器 st(0) ~ st(7),形成一个栈,st(0)为栈顶, s(7)为栈底

指令 指令格式 指令说明
finit finit 启动浮点数运算器
flds, fldl fldl 源 将源地址浮点值压入栈顶,即st(0),原来的st(0)移动到st(1),依次执行 flds用于float,fldl用于double
fstps, fstpl fstpl 目的 将栈顶元素弹出到目的地址,即st(0)弹出到目的地址,st(1)移动到st(0),依次执行
fadd fadd %st(x), %st(0) fadd %st(0), %st(x) %st(0) = %st(0) + %st(x) %st(x) = %st(x) +%st(0)
fsub, fmul, fdiv   用法同fadd

推荐书籍: Professional Assembly Language.pdf


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部