侧边栏壁纸
  • 累计撰写 16 篇文章
  • 累计创建 17 个标签
  • 累计收到 1 条评论

寄存器和AT&T汇编指令整理

xiuxiubiu
2021-12-10 / 0 评论 / 2 点赞 / 1,427 阅读 / 4,247 字 / 正在检测是否收录...

寄存器

整数寄存器

整数寄存器.png

操作数格式

类型格式操作数值名称
立即数$ImmImm立即数寻址
寄存器raR[ra]寄存器寻址
存储器ImmM[Imm]绝对寻址
存储器(ra)M[R[ra]]间接寻址
存储器Imm(rb)M[Imm+R[rb]](基址+偏移量)寻址
寄存器(rb, ri)M[rb+ri]变址寻址
寄存器Imm(rb, ri)M[Imm+rb+ri]变址寻址
寄存器(, ri,s)M[R[ri]*s]比例变址寻址
寄存器Imm(, ri,s)M[Imm+R[ri]*s]比例变址寻址
寄存器(rb, ri,s)M[R[rb]+R[ri]*s]比例变址寻址
寄存器Imm(rb, ri,s)M[Imm+R[rb]+R[ri]*s]比例变址寻址

浮点寄存器

浮点寄存器.png

汇编指令

数据传送指令

简单的数据传送指令

指令效果描述
MOV S, DD <- S传送
movb 传送字节
movw 传送字
movl 传送双字
movq 传送四字
movabsq I, RR <- I传送绝对的四字

零扩展数据传送指令

指令效果描述
MOVZ S, RR <- 零扩展(S)以零扩展进行传送
movzbw 将做了零扩展的字节传送到字
movzbl 将做了零扩展的字节传送到双字
movzwl 将做了零扩展的字传送到双字
movzbq 将做了零扩展的字节传送到四字
movzwq 将做了零扩展的字传送到四字

符号扩展数据传送指令

指令效果描述
MOVS S, RR <- 符号扩展(S)传送符号扩展的字节
movsbw 将做了符号扩展的字节传送到字
movsbl 将做了符号扩展的字节传送到双字
movswl 将做了符号扩展的字传送到双字
movsbq 将做了符号扩展的字节传送到四字
movswq 将做了符号扩展的字传送到四字
movslq 将做了符号扩展的双字传送到四字
cltq%rax <- 符号扩展(%eax)把%eax符号扩展到%rax

入栈和出栈指令

指令效果描述
pushq SR[%rsp] <- R[%rsp]-8;
M[R[%rsp]] <- S
将四字压入栈
popq DD <- M[R[%rsp]];
R[%rsp] <- R[%rsp]+8
将四字弹出栈

算术和逻辑操作

整数算术操作

指令效果描述
leaq S, DD <- &S加载有效地址
INC DD <- D+1加1
DEC DD <- D-1减1
NEG DD <- -D取负
NOT DD <- ~D取补
ADD S, DD <- D+S
SUB S, DD <- D-S
IMUL S, DD <- D*S
XOR S, DD <- D^S异或
OR S, DD <- D|S
AND S, DD <- D&S
SAL k, DD <- D<<k左移
SHL k, DD <- D<<k左移(等同于SAL)
SAR k, DD <- D>>Ak算术右移
SHR k, DD <- D>>Lk逻辑右移

特殊算数操作

指令效果描述
imulq SR[%rdx]:R[%rax] <- SxR[%rax]有符号全乘法
mulq SR[%rdx]:R[%rax] <- SxR[%rax]无符号全乘法
cltoR[%rdx]:R[%rax] <- 符号扩展(R[%rax])转换为八字
idivq SR[%rdx] <- R[%rdx]:R[%rax] mod S
R[%rdx] <- R[%rdx]:R[%rax] ÷ S
有符号除法
divq SR[%rdx] <- R[%rdx]:R[%rax] mod S
R[%rdx] <- R[%rdx]:R[%rax] ÷ S
无符号除法

条件码

比较和测试指令

指令基于描述
CMP S1, S2S2 - S1比较
cmpb比较字节
cmpw比较字
cmpl比较双字
cmpq比较四字
TEST S1, S2S1 & S2测试
testb测试字节
testw测试字
testl测试双字
testq测试四字

SET指令

指令同义名效果设置条件
sete DsetezD <- ZF相等/等
setne DsetnzD <- ~ZF不等/非零
sets DD <- SF负数
setns DD <- ~SF非负数
setg DsetnleD <- ~(SF^OF) & ~ZF大于(有符号>)
setge DsetnlD <- ~(SF^OF)大于等于(有符号>=)
setl DsetngeD <- SF^OF小于(有符号<)
setle DsetngD <- (SF^OF)|ZF小于等于(有符号<=)
seta DsetnbeD <- ~CF & ~ZF超过(无符号>)
setae DsetnbD <- ~CF超过或相等(无符号>=)
setb DsetnaeD <- CF低于(无符号<)
setbe DsetnaD <- CF|ZF低于或相等(无符号<=)

跳转指令

指令同义名跳转条件描述
jmp Label1直接跳转
jmp Operand1间接跳转
je LabeljzZF相等/零
jne Labeljnz~ZF不相等/非零
js LabelSF负数
jns Label~SF非负数
jg Labeljnle~(SF^OF) & ~ZF大于(有符号>)
jge Labeljnl~(SF^OF)大于或等于(有符号>=)
jl LabeljngeSF^OF小于(有符号<)
jle Labeljng(SF^OF)|ZF小于或等于(无符号<=)
ja Labeljnbe~CF & ~ZF超过(无符号>)
jae Labeljnb~CF超过或相等(无符号>=)
jb LabeljnaeCF低于(无符号<)
jbe LabeljnaCF|ZF低于或相等(无符号<=)

条件传送指令

指令同义名传送条件描述
cmove S, RcmovzZF相等/零
cmovne S, Rcmovnz~ZF不相等/非零
cmovs S, RSF负数
cmovns S, R~SF非负数
cmovg S, Rcmovnle~(SF^OF) & ~ZF大于(有符号>)
cmovge S, Rcmovnl~(SF^OF)大于或等于(有符号>=)
cmovl S, RcmovngeSF^OF小于(有符号<)
cmovle S, Rcmovng(SF^OF)|ZF小于或等于(有符号<=)
cmova S, Rcmovnbe~CF & ~ZF超过(无符号>)
cmovae S, Rcmovnb~CF超过或相等(无符号>=)
cmovb S, RcmovnaeCF低于(无符号<)
cmovbe S, RcmovnaCF|ZF低于或相等(无符号<=)

过程相关指令

转移控制指令

指令描述
call Lable过程调用
call Operand过程调用
ret从过程调用中返回

浮点数汇编指令

浮点数传送指令

指令目的描述
vmovssM32X传送单精度数
vmovssXM32传送单精度数
vmovsdM64X传送双精度数
vmovssXM64传送双精度数
vmovapsXX传送对齐的封装好的单精度数
vmovapdXX传送对齐的封装好的双精度数

浮点数转整数

指令目的描述
vcvttss2tiX/M32R32用截断的方法把单精度数转换成整数
vcvttsd2siX/M64R32用截断的方法把双精度数转换成整数
vcvttss2siqX/M32R64用截断的方法把单精度数转换成四字整数
vcvttsd2siqX/M64R64用截断的方法把双精度数转换成四字整数

整数转浮点数

指令源1源2目的描述
vcvtsi2ssM32/R32XX把整数转换成单精度数
vcvtsi2sdM32/R32XX把整数转换成双精度数
vcvtsi2ssqM64/R64XX把四字整数转换成单精度数
vcvtsi2sdqM64/R64XX把四字整数转换成双精度数

浮点数相互转换指令

使用如下指令集合将单精度浮点数转为双精度:

指令源1源2目的描述
vunpcklpsXXXvunpcklps指令通常用来交叉放置来自XMM寄存器的值,把它们存储到第三个寄存器中。也就是说,如果一个源寄存器的内容为字[s3, s2, s1, s0],另一个源寄存器为字[d3, d2, d1, d0],因为单精度占用二字(4字节,32位),那么目的寄存器的值会是[s1, d1, s0, d0],四字就可以保存两个单精度所有的字
vcvtps2pdXXcvtps2pd指令把源XMM寄存器中的两个低位单精度值扩展成目的XMM寄存器中的两个双精度值。对前面vunpcklps指令的结果应用这条指令会得到值[dx0, dx0],这里的dx0是将x转换成四字双精度后的结果,也就是一个dx0代表四字8字节64位,即%xmm0中存储了两份相同的x的双精度值

使用如下指令集合将双精度浮点数转为单精度:

指令源1目的描述
vmovddupXX假设寄存器%xmm0保存着两个双精度值[x1, x0]。然后vmovddup指令把它设置为[x0, x0]
vcvtpd2psxXXvcvtpd2psx指令把俩个值转换成单精度,再存放到该寄存器(xmm寄存器16位)的低位(8字节)一半(4字节)中,并将高位一半设置为0,得到结果[0.0, 0.0, x0, x0],此结果中x0为单精度值,占用二字4字节32位,即寄存器保存了两份单精度值

浮点数运算指令

单精度双精度效果描述
vaddssvaddsdD<-S2 + S1浮点数加
vsubssvsubsdD<-S2 - S1浮点数减
vmulssvmulsdD<-S2 x S1浮点数乘
vdivssvdivsdD<-S2 / S1浮点数除
vmaxssvmaxsdD<-max(S2, S1)浮点数最大值
vminssvminsdD<-min(S2, S1)浮点数最小值
sqrtsssqrtsdD<-根号S1浮点数平方根

浮点数位操作指令

单精度双精度效果描述
vxorpsvorpdD<-S2 ^ S1位级异或(EXCLUSIVE-OR)
vandpsandpdD<-S2 & S1位级与(AND)

浮点数比较指令

指令基于描述
ucomiss S1, S2S2 - S1比较单精度值
ucomisd S1, S2S2 - S1比较双精度值

比较指令会设置三个条件码:零标志位ZF、进位标志位CF和奇偶标志位PF。C语言中如果有参数为NaN则设置PF位为1。条件码的设置条件如下:

顺序S2 : S1CFZFPF
无序的111
S2 < S1100
S2 = S1010
S2 > S1000
0

评论