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	与

	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值为当前程序栈顶元素
					将栈顶元素出栈
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值