跳到主要内容

指令

机器语言基于两种重要的抽象:指令集架构和虚拟内存

数据类型:byte (b), word (w), double word (l), quad word (q)

寄存器及其用途

操作符表示

指令

  • 移动指令:
    • 直接移动:movb, movw, movl, movq, movabsq
    • 高位补零扩展:movzbw, movzbl, movzbq, movzwl, movzwq
    • 高位补符号扩展:movsbw, movsbl, movsbq, movswl, movswq, movslq, cltq
  • 栈操作指令:pushq, popq
  • leaq
  • 基本算术:inc dec neg not add sub imul xor and sal shl sar shr
  • 特殊算术:imulq, mulq, cqto, idivq, divq
  • 基本算术会调整条件码(CF、ZF、SF、OF),cmp, test 会调整条件码但不改变其他
  • 设置指令:set[e/z, ne/nz, s, ns, g/nle, ge/nl, l/ge, le/ng, a/be, ae/nb, b/nae, be/na]
  • 跳转指令:jmp, jmp *
  • 条件跳转指令:j[e/z, ne/nz, s, ns, g/nle, ge/nl, l/ge, le/ng, a/nbe, ae/nb, b/nae, be/na]
  • 条件移动指令:cmov[e/z, ne/nz, s, ns, g/nle, ge/nl, l/ge, le/ng, a/nbe, ae/nb, b/nae, be/na]

控制流的实现

条件(1)

t = expr;
if (!t) goto then;
stmt1;
goto done;
then: stmt2;
done:

条件(2)

v1 = stmt1;
v2 = stmt2;
t = expr;
if (!t) v1 = v2;
return v1;

do-while 循环

loop: stmt;
t = expr;
if (t) goto loop;

while 循环(jump to middle)

goto test;
loop: stmt;
test: t = expr;
if (t) goto loop;

while 循环(guarded do)

t = expr;
if (!t) goto done;
loop: stmt;
t = expr;
if (t) goto loop;
done:

for 循环

init;
while (test) {
body;
update;
}

switch

将 switch 的整数范围加上一个偏移量变为小的无符号整数,然后按 jump table 索引

过程

按以下顺序入栈:

  • 第 7 ~ n 个参数
  • 返回地址
  • 寄存器
  • 局域变量
  • ……

数组、结构体、共用体

数组顺序存储;结构体顺序存储,但可能有内存对齐;共用体从同一个地方开始存储,空间取决于最大的成员