程序编码
机器级代码
程序内存包括:
程序的可执行机器代码,操作系统必要信息,管理过程调用的运行时栈,用户分配的内存块
程序内存用虚拟地址来寻址,在任意给定时刻,只有有限一部分虚拟地址被认为是合法的。
指令
寄存器作用
- 程序计数器:PC ,%rip,下一条指令的内存中的地址。
通用目的寄存器:
- rax:返回值
- rbx:被调用者保存
- rcx:第四个参数
- rdx:第三个参数
- rsi:第二个参数
- rdi:第一个参数
- rbp:被调用者保存
- rsp:栈指针,指明栈的结束位置
- r8:第五个参数
- r9:第六个参数
- r10:调用者保存
- r11:调用者保存
- r12:被调用者保存
- r13:被调用者保存
- r14:被调用者保存
- r15:被调用者保存
§CS(代码段)指明代码段的起始地址
§SS(堆栈段)指明堆栈段的起始地址
§DS(数据段)指明数据段的起始地址
§ES(附加段)指明附加段的起始地址
¢SP为堆栈指针寄存器,指示栈顶的偏移地址
¢SP不能再用于其他目的,具有专用目的
¢BP为基址指针寄存器,表示数据在堆栈段中的基地址
¢它与代码段寄存器CS联用,确定下一条指令的物理地址
¢计算机通过CS : IP寄存器来控制指令序列的执行流程
¢IP寄存器是一个专用寄存器**
生成小于8字节结果的指令:生成1字节和2字节的指令会保持剩下的字节不变;生成4字节的指令会把高位4个字节置为0。
操作数
Imm(r,r,s) : 代表的取M[Imm + R[rb]+R[ri]*s ]
- Imm立即数
- rb基址寄存器
- ri变址寄存器
- s比例因子
基本指令
传送类指令
- mov src,dest
- movb 字节
- movw 字
- movl 双字,以寄存器作为dest时候会把高四字节也置为0
- movq 四字
- movabsq 绝对四字
- dest要么是寄存器要么是内存地址
- src,dest不能都是内存地址
- movz:剩余字节填充0
- 例如movzbl:零扩展将字节扩展为双字
- movs:剩余字节填充符号位
栈操作
栈向下增长(地址减小),栈顶元素是所有元素地址最低的元素。
rsp 保存栈顶地址
- pushq:入栈
- 例如pushq %rbp 等价于
- subq $8,%rsp
- movq %rbp,(%rsp)
- 先减小在入栈
- 例如pushq %rbp 等价于
- popq:出栈
- 例如popq %rax
- movq (%rsp),%rax 先出栈
- addq $8,%rsp 再指针增加
- 例如popq %rax
算数操作
leadq S,D:D=&S 加载有效地址
- leaq 7(%rdx,%rdx,4),%rax : 将%rax值设置为:5*rdx + 7
ADD S,D:D=S+D
SAL k,D: D = D<
SHR k,D: 逻辑右移
条件码
CF:进位标志。最高位产生进位
ZF:零标志
SF:符号标志
OF:溢出标志,补码正溢出或者负溢出
比较指令
CMP s1,s2:S2-S1
Test s1,s2:s1&s2
跳转
jmp
je :ZF=0跳转
jne:
js:SF=1跳转
jns
jg:大与跳转
jge:
PC执行相对寻址的时候,程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身的地址。
结构
数组
对齐
任何K字节的基本对象的地址必须是K的倍数。