Site Overlay

ATT 汇编常用指令入门

寄存器

  1. sp:栈寄存器,指向栈顶。
  2. bp:栈基址寄存器,指向栈底。
  3. ip:指令寄存器,指向下一条待执行指令。
  4. si: 源变址寄存器
  5. di: 目的变址寄存器

前缀:

  1. 没有前缀,则是 16bit
  2. e 前缀,是 32bit
  3. r 前缀,是 64bit

后缀:

  1. ?l 表示是 ?x 的低 8 位。
  2. ?h 表示是 ?x 的高 8 位。

标识寄存器

typora\20201026220110_d34a3aea42dca4a076d4d73bc364480c.png

详见:https://blog.csdn.net/weixin_42617472/article/details/82187750

需要记住的:

OF-Overflow 是否溢出

SF-Sign 是否有符号

ZF-Zero 是否为零

CF-Carry 是否进位

ps:为了方便记(kao)忆(shi),下面提及的寄存器可能使用简称

基础

img

寄存器%eax 这样子表示。

操作顺序 从左到右。左边是 source,右边是 destination。

立即数$0x00d 这样。

寻址方式d(b, i, s) 表示的地址是 $d + b + is$

长度表示:在指令后面的 l 等,比如 movll,表示参数长度。

间接寻址(%rax) 表示以 %rax 的值作为内存地址,寻找那个内存地址中的数据。

变址寻址4(%rax) 表示以 %rax + 4 的值作为内存地址,寻找那个内存地址中的数据。

函数调用的过程

相关寄存器:返回值保存在 ax,参数保存在 di,si,dx,cx,r8,r9,更多参数放在调用栈上,栈在内存里。

栈=栈帧+栈帧+...。栈帧=被保存的寄存器+局部变量+参数构造区

被保存的寄存器=被调用者保存的寄存器+调用者保存的寄存器

被调用者保存的寄存器=bx+bp, 12-15。其它都是调用者保存。

函数调用时,把被调存寄存器 push 入栈,为了保存局部变量,往往会 subq $num, %rsp,这是为局部变量划分空间,最后会 addq $num, %rsp,这是归还空间。

对于栈中第一个参数(函数第七个参数(前六个放在寄存器)),存放的地址是 8 + %rsp,8 是留给返回值的。

call 指令等价于:sp-=8(存返回地址), push ip

指令

mov:传送数据。

lea:传送数据,不解引用。

enter、leave、call、ret指令:请参考 https://blog.csdn.net/liutianshx2012/article/details/50974839/

mov-, lea-, imul- 的常用后缀

-b:b=byte,8bit
-s:s=short,16bit integer;32bit floating point
-l:l=long,32bit integer;64bit floating point
-q:q=quad,64bit
-t:t=ten btyes,80bit floating point

mul 是无符号乘法。

i- 前缀是有符号运算,比如 imul, idiv

mov-abs-q:Move absolute quad word

mov-s-b-q:Move Sign extended Byte to Quad

mov-z-w-q:Move Zero extended Word to Byte

cltq:convert long to quad word 扩展 eax 到四字。相当于 movslq %eax,%rax

cqto convert quad to oct ,读 %rax的符号位,并将它复制到%rdx的所有位。

movw 把 16 位立即数放到寄存器的低 16 位,高 16 位清 0
movt 把 16 位立即数放到寄存器的高 16 位,低 16位不影响

sal:左 l 算数 a 移位 s。

sal DEST ;把 DEST 的值左移 1 bit
sal n, DEST ;把 DEST 的值左移 n bit

sar:右移位。slr 用于无符号。

移位语法参考:https://blog.csdn.net/chentaoxie/article/details/99091023

cmp:比较大小。详见:https://blog.csdn.net/feixiang3839/article/details/82666090 cmp a,b 设置的条件根据 b - a

testtest a, b根据 a & b 设置条件。

sethttps://www.cnblogs.com/oBYBo/p/13028964.html,https://www.cnblogs.com/hjbf/p/13197285.html

条件指令后缀:

后缀 作用条件
-e/z b = a Equal,相等
-ne/nz b != aNot Equal,不等
-s n < 0 Sign,有符号,即负数
-ns n >= 0 Not Sign,无符号
-g b > a Greater
-ge b >= a Greater or Equal
-l b < a Less
-le b <= a Less or Equal
-a b > a Above(无符号)
-ae b >= a Above or Equal(无符号)
-b b < a Below(无符号)
-be b <= a Below(无符号)

jmp 无条件跳转

j- 条件跳转

跳转参考:https://blog.csdn.net/weixin_32589873/article/details/78207020

https://zhuanlan.zhihu.com/p/104731421

cmov (Conditional Move)条件传送

发表评论

电子邮件地址不会被公开。 必填项已用*标注