【发布时间】:2015-01-20 17:19:47
【问题描述】:
所以,我有一个程序可以生成 JIT x86 机器代码并直接执行它,我希望它也支持 x86-64/AMD64/x64。明显的区别是:
- 新寄存器(
rax、r8...)和指针宽度(指针需要使用 64 位 reg) - 默认 C 调用约定(堆栈参数与寄存器参数)
- 一些新的助记词(
pushq推送64位)
二进制指令是否也有任何差异,或者在适当的时候使用 pushq 和 64 位寄存器是否应该(大致)足够并且代码可以正常工作?
代码示例:
static inline void emit_call(uint32_t target) {
emit_byte(0xE8);
emit_dword(target - ((uint32_t)out + 4));
}
如果我使用 uintptr_t 而不是 uint32_t 我认为这仍然有效,
但是将立即数加载到 64 位寄存器 rax 与将其加载到较低的 32 位别名中是不同的:
static void emit_mov_x86reg_immediate(int x86reg, int imm) {
emit_byte(0xB8 | x86reg);
emit_dword(imm);
}
还有其他区别吗?
我正在处理的代码可以通过here 访问,如果你想看看的话。
【问题讨论】:
-
有很多不同之处。有些列在我的(已关闭)SO 问题stackoverflow.com/questions/11897116/… 中。
-
push仍然是旧指令,没有新的助记符,只是一个新的 AT&T 后缀,或者在不需要后缀的地方只使用 Intel 语法
标签: assembly x86 x86-64 jit machine-code