总结用,可能以后会修改
寄存器
其中%rsp为栈指针,%rip为PC地址
寻址模式
数据传送指令
-
后缀
字符 对应字长 q 8字节(64位) l 4字节(32位) w 2字节(16位) b 1字节(8位) -
不同指令
指令 作用 mov 一般传送 movs 符号扩展传送 movz 0扩展传送 xchg 数据交换 push/pop 出入栈 -
exp:
(1) movslq指以符号扩展传送方式,将参数从4字节扩展为8 字节指令 代码 movq $0x4,%rax temp = 0x4 movq $-147,(%rax) *p = -147; movq %rbx,%rdx temp2 = temp1; movq %rax,(%rdx) *p = temp; movq (%rax),%rdx temp = *p;
地址传送指令lea
- 格式:leaq src,dst
- src为地址计算式,将src的地址直接赋给dst的内容
- exp:leaq (%rax),%rdx = movq %rax,%rdx
- 不改变条件码
算术运算指令
- 两元
- 一元
- 移位的不同区别(移位只接受单字节类寄存器)
算数移位:salq,sarq
逻辑移位:shlq,shrq - 特殊运算指令
指令中只给出一个操作数,另一个操作数(乘法是%rax, 除法是%rdx:%rax),目的操作数也隐含(乘法是%rdx:%rax, 除法商在%rax余数在%rdx)
注意cltq指令是吧%eax类寄存器扩展为%rax,不要与clto混淆
出入栈
- 格式:push/pop %rax
- 等价于:
push %rax:
subq $8,%rsp
movq %rax,(%rsp)
pop %rax:
movq (%rsp),%rax
addq $8,%rsp
控制
-
条件码:
-
会设置条件码的指令
排除leaq -
只设置条件码而不改变任何其他寄存器
注意cmp指令是右比较左,例如cmp $0,%rbx
jg …该指令成立的条件是%rbx>0
-
访问条件码
- Set X指令:
- 基于条件码的组合将目标的低位字节设置为0或1。(%cl)
- 不改变剩余的7字节。
- exp
转化为汇编
- Set X指令:
-
跳转指令
- 根据条件码跳转到代码的不同部分
- 根据条件码跳转到代码的不同部分
-
用条件传送来实现条件分支
- 条件传送指令:
cmovs S, D //负数时传送
cmovns S, D //非负数时传送
- 条件传送指令:
-
switch语句
过程调用
- 帧栈
- 寄存器保护习惯