如何验证x86命令的输出?

时间:2016-06-19 06:34:12

标签: assembly x86 instructions instruction-set

执行x86命令时,我很难确定存储在特定寄存器中的相应地址和值。

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

eax = 0x40000, ebx = 0x100000

下面,执行的命令列在每行的左侧。然后,在每一行中,答案包含地址的目的地寄存器,最后是我想出的值/地址。 每个新行都会影响寄存器的后续值;例如,在第一行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命令是否将寄存器设置为&#39}。 0'是否在xor edx, edx命令中。

如果你纠正我的结果并解释棘手的部分/命令,我将非常感激。

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

table with x86 operations

2 个答案:

答案 0 :(得分:3)

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

这不会更改EAXEBX的值。只有dword在0x00100000。

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

此处执行的计算是EBX加上EAX的4倍 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。

锻炼不是太难了!只要想想每个操作的作用(在手册中查找),然后进行数学计算。

答案 1 :(得分:1)

xor same,same will always zero the register,是最好的方法。

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

要检查其他指令的答案,只需将该代码汇编成可执行文件并在gdb中单步执行,同时观察寄存器值的变化。请参阅 tag wiki

的底部 BTW,“命令”是描述x86指令的错误词。一些汇编语言显然使用“命令”作为通常术语的一部分,但x86没有。