问题描述
我刚开始学习 x86_64 汇编,试图移动地址 0x400da6 中的某些内容来注册 eax,我使用
mov 0x400da6,%eax
但这会导致二进制文件末尾出现 00,如何避免这种情况?
0: 8b 3c 25 a6 0d 40 00 mov 0x400da6,%eax
解决方法
您将需要一个 tmp 寄存器(例如您将无论如何都要覆盖的 EAX)来以一种避免任何 00 字节的方式构造地址,然后是 mov (%rax),%eax
。使用 24 位绝对地址的加载没有编码。
例如:
mov $0x400da6 + 0x1111111,%eax
mov -0x1111111(%rax),%eax
生成的机器码为:
note non-zero high byte
vv
0: b8 b7 1e 51 01 mov eax,0x1511eb7
5: 8b 80 ef ee ee fe mov eax,DWORD PTR [rax-0x1111111]
您可以使用任何您想要的常量,只要它适合 32 位符号扩展的 disp32,以便您可以将其用作寻址模式的一部分。如果您需要其他操作,例如 XOR,则需要与负载分开进行 XOR; x86 寻址模式只能添加 2 的补码符号扩展的 8 位或 32 位值。