如何验证 x86 命令的输出?

How can one validate output of x86 commands?

当执行 x86 命令时,我很难找出存储在特定寄存器中的适当地址和值。

我尝试使用分配给这两个寄存器的初始值来执行以下指令:

eax = 0x40000, ebx = 0x100000

下面,每行的左侧列出了执行的命令。然后,在每一行中,答案都包含地址的目标寄存器,最后是我想出的 value/address 。 每一个新行都会影响寄存器的后续值;例如在第一行 eax 更改了 ebx 的地址,因此 ebx 不再指向 0x100000 值:

mov [ebx], eax               -> answer: [0x100000] 0x40000 
lea esp, [ebx+eax*4]         -> answer: esp [0x440000] 
xor edx, edx                 -> answer: edx 0x00000
sub edx, eax                 -> answer: edx 0x40000
adc ebx, eax                 -> answer: ebx 0x80000
shl eax, 13                  -> answer: eax 0x100000000
add ebx, eax                 -> answer: ebx 0x100040000
push ebx                     -> answer: esp 0x100040000 
sar eax, 31                  -> answer: eax 0x00000002
push eax                     -> answer: esp 0x00000002
mov eax, [esp+4]             -> answer: eax 0x00000202
not eax                      -> answer: ecx 0x2
sub eax, [esp]               -> answer: eax 0x200

我对以下命令有特殊问题:leanotsar,我不确定 xor 命令是否将寄存器设置为“0” ' 是否在 xor edx, edx 命令中。

如果您更正我的结果并解释棘手的问题,我将不胜感激parts/commands。

P.S。要查看 table 中的完整操作列表,请查看照片。

table with x86 operations

,这是最好的方法。

关于 LEA 的规范问答之一是 What's the purpose of the LEA instruction?。 (TL;DR:这是一条使用内存操作数语法和机器编码的移位加法指令)。


要检查其他指令的答案,只需 assemble 将该代码转换为可执行文件并在 gdb 中单步执行它,同时观察寄存器值的变化。见底 tag wiki.


顺便说一句,"command" 是描述 x86 指令的错误词。一些汇编语言显然使用 "command" 作为常用术语的一部分,但 x86 没有。

mov [ebx], eax               -> answer: [0x100000] 0x40000

这不会更改 EAXEBX 的值。只有 0x00100000 处的双字。

lea esp, [ebx+eax*4]         -> answer: esp [0x440000]

这里执行的计算是EBX加上4次EAX
0x00100000 + 0x00040000 * 4 = 0x00200000

xor edx, edx                 -> answer: edx 0x00000

正确。

sub edx, eax                 -> answer: edx 0x40000

从零中减去 0x00040000 会给你一个负面的结果。你写的是正数!

adc ebx, eax                 -> answer: ebx 0x80000

将 0x00040000 与 0x00100000 相加得出比该值更大的数字:0x00140000。


这不是一个太难的练习!只需考虑每个操作的作用(在手册中查找),然后进行数学计算。