第三章汇编指令汇总
以下是csapp书中常用的汇编指令的汇总
具体到每一行指令来看,是按照:
指令名称 操作数 功能描述
这样的格式组织的
希望能帮助大家复习,阅读第三章的代码
正文:
mov类
movb S,D S->D
movw S,D S->D
movl S,D S->D
movq S,D S->D
movzbw S,D S->D
movzbl S,D S->D
movzwl S,D S->D
movzbq S,D S->D
movzwq S,D S->D
(movzlq不存在,其功能由movl实现了)
movsbw S,D S->D
movsbl S,D S->D
movswl S,D S->D
movsbq S,D S->D
movswq S,D S->D
movslq S,D S->D
cltq S,R S->R
mov类的指令功能是数据传送
格式:mov(1)(2)(3)
1处字母为s,z或者没有
s(Sign)表示对操作数进行有符号扩展之后再传送
z(Zero)表示对操作数进行零扩展之后再传送
2处字母为bwlq,表示源操作数的大小
分别对应1,2,4,8个字节
3处字母为bwlq,表示目的操作数的大小
分别对应1,2,4,8个字节
栈类
具体操作
push S subq $8,(%rsp)
movq %rbp,(%rsp)
popq D movq (%rsp),%rax
addq $8,(%rsp)
算术和逻辑类
leaqS,D &S->D 加载有效地址
inc D D+1->D 加一
dec D D-1->D 减一
neg D -D->D 取负
not D ~D->D 取补
add S,D S+D->D 加
sub S,D S-D->D 减
imulS,D S*D->D 乘
xor S,D S^D->D 异或
or S,D S|D->D 或
and S,D S&D->D 与
sal k,D D<<k->D 算术左移
shl k,D D<<k->D 逻辑左移
sar k,D D>>k->D 算术右移
shr k,D D>>k->D 逻辑右移
特殊的算术运算
imulq S 八字有符号乘法
结果低位保存在上一行代码给出的寄存器中,高位保存在操作数给出的寄存器中
mulq S 八字无符号乘法
结果低位保存在上一行代码给出的寄存器中,高位保存在操作数给出的寄存器中
cqto 无 符号扩展转换为八字
结果低位高位分别保存在两个寄存器中
idivq S 八字有符号除法,用上一行给出的寄存器的值除以寄存器S的值
余数存在本行给出的寄存器中,商存在上一行给出的寄存器中
divq S 八字无符号除法,用上一行给出的寄存器的值除以寄存器S的值
余数存在本行给出的寄存器中,商存在上一行给出的寄存器中
cmp类
格式:
cmp(1) S1,S2 用于比较S2:S1,(1)处填后缀字母,
同mov类一样,(1)处bwlq后缀表示了比较对象的大小,bwlq分别表示1,2,4,8字节
cmpb S1,S2
cmpw S1,S2
cmpl S1,S2
cmpq S1,S2
test类
格式:
test(1) S1,S2 一般而言,S1S2取同一个表达式,表明判断S1的正负,
同mov类一样,(1)处bwlq后缀表示了比较对象的大小,bwlq分别表示1,2,4,8字节
testb S1,S2
testw S1,S2
testl S1,S2
testq S1,S2
jmp类
格式:
jmp Label 根据上一行的test或cmp指令结果,跳转到特定地址
通常是一段代码的起始指令地址
名称 跳转条件
jmp Label 无条件跳转
je Label 相等/零
jne Label 不相等/非零
js Label 负数
jns Label 非负数
jg Label 大于(有符号>)
jge Label 大于等于(有符号 >=)
jl Label 小于(有符号<)
jle Label 小于等于(有符号<=)
ja Label 大于(无符号>)
jae Label 大于等于(无符号>=)
jb Label 小于(无符号<)
jbe Label 小于等于(无符号<=)
跳转指令的命名是根据缩写英文缩写来命名的,便于记忆
jmp(jump)无条件跳转
je(Jump when Equal)
jne(Jump when Not Equal)
subtractive有负号的
js(Jump when Subtractive)
jns(Jump when Non-Subtractive)
下面四条是针对有符号数的指令
jg(Jump when Greater)
jge(Jump when Greater or Equal)
jl(Jump when Less)
jle(Jump when Less or Equal)
下面四条是针对无符号数的指令
ja(Jump when Above)
jae(Jump when Above or Equal)
jb(Jump when Below)
jbe(Jump when Below or Equal)
cmov类
cmov S,R 根据上一行的cmp指令或test指令结果
当条件满足时执行传送指令
名称 传送条件
cmove S,R 相等/零
cmovne S,R 不相等/非零
cmovs S,R 负数
cmovns S,R 非负数
cmovg S,R 大于(有符号>)
cmovge S,R 大于等于(有符号 >=)
cmovl S,R 小于(有符号<)
cmovle S,R 小于等于(有符号<=)
cmova S,R 大于(无符号>)
cmovae S,R 大于等于(无符号>=)
cmovb S,R 小于(无符号<)
cmovbe S,R 小于等于(无符号<=)
缩写规则和跳转指令是一样的
转移控制类
call Label 将下一行代码起始指令地址入栈
修改PC值为操作数Label
Label不管以怎样的方式表示,这应当是一个地址
这个地址应当指向调用部分函数的起始指令地址
ret 修改PC值为当前程序栈顶元素
将栈顶元素出栈