跳到主要内容

机器级代码与寄存器

机器语言、汇编语言和高级语言是什么关系?​

  • 机器语言: 只是一串字节, 是若干指令的编码, 不含任何源码信息;
  • 汇编语言: 机器语言的文本形式, 指令和寄存器有可读名字;
  • 高级语言: C 等语言, 必须编译成机器码才能执行;
// C
long mult2(long, long);
void multstore(long x, long y, long *dest) {
long t = mult2(x, y);
*dest = t;
}
// 汇编
multstore:
pushq %rbx
movq %rdx, %rbx
call mult2
movq %rax, (%rbx)
popq %rbx
ret

// 机器语言
53 48 89 d3 e8 00 00 00 00 48 89 03 5b c3

反汇编器做什么?​

  • 作用: 把机器语言转换成类似汇编语言的格式;
  • 用途: 检查编译器输出、分析崩溃现场、验证安全假设;

通用目的寄存器有哪些用途?​

  • 数量: 一组 16 个可存储 64 位值的寄存器;
  • 存放内容: 整数数据与指针;
  • 命名: 同一寄存器按位宽有不同后缀, 如 %rax、%eax、%ax;

常见的指令类别有哪些?​

  • 数据传输: 在寄存器与内存之间搬运数据;
  • 入栈/出栈: 维护运行时栈;
  • 加载: 取出有效地址;
  • 算术运算: 加减乘除与逻辑运算;
  • 跳转: 改变控制流;

浮点值存储在哪里?​

  • 寄存器: XMM 寄存器 (128 位) 与 YMM 寄存器 (256 位);
  • 指令集: SSE 与 AVX;
  • 相关问题: 浮点值的存储与访问、浮点运算指令、参数的传递与结果的返回、调用过程中寄存器的保存规则;