程序编码

机器级代码

程序内存包括:
程序的可执行机器代码,操作系统必要信息,管理过程调用的运行时栈,用户分配的内存块
程序内存用虚拟地址来寻址,在任意给定时刻,只有有限一部分虚拟地址被认为是合法的。

指令

寄存器作用

  • 程序计数器:PC ,%rip,下一条指令的内存中的地址。

通用目的寄存器:

  1. rax:返回值
  2. rbx:被调用者保存
  3. rcx:第四个参数
  4. rdx:第三个参数
  5. rsi:第二个参数
  6. rdi:第一个参数
  7. rbp:被调用者保存
  8. rsp:栈指针,指明栈的结束位置
  9. r8:第五个参数
  10. r9:第六个参数
  11. r10:调用者保存
  12. r11:调用者保存
  13. r12:被调用者保存
  14. r13:被调用者保存
  15. r14:被调用者保存
  16. 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比例因子

基本指令

传送类指令

  1. mov src,dest
    1. movb 字节
    2. movw 字
    3. movl 双字,以寄存器作为dest时候会把高四字节也置为0
    4. movq 四字
    5. movabsq 绝对四字
    6. dest要么是寄存器要么是内存地址
    7. src,dest不能都是内存地址
    8. movz:剩余字节填充0
      1. 例如movzbl:零扩展将字节扩展为双字
    9. movs:剩余字节填充符号位

栈操作

栈向下增长(地址减小),栈顶元素是所有元素地址最低的元素。
rsp 保存栈顶地址

  • pushq:入栈
    • 例如pushq %rbp 等价于
      • subq $8,%rsp
      • movq %rbp,(%rsp)
      • 先减小在入栈
  • popq:出栈
    • 例如popq %rax
      • movq (%rsp),%rax 先出栈
      • addq $8,%rsp 再指针增加

算数操作

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<SAR k,D:D = D>>k 算数右移
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的倍数。