机器级代码与寄存器
机器语言、汇编语言和高级语言是什么关系?
- 机器语言: 只是一串字节, 是若干指令的编码, 不含任何源码信息;
- 汇编语言: 机器语言的文本形式, 指令和寄存器有可读名字;
- 高级语言: 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;
- 相关问题: 浮点值的存储与访问、浮点运算指令、参数的传递与结果的返回、调用过程中寄存器的保存规则;