CSAPP第三章常⽤汇编指令总结第三章汇编指令汇总
以下是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 与
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 ⼩于等于(⽆符号<=)
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值为当前程序栈顶元素
将栈顶元素出栈
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论