当执行 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
我对以下命令有一个特殊的问题:lea
、not
和 sar
我不确定 xor
命令在 xor edx, edx
命令中将寄存器设置为“0”。
如果您更正我的结果并解释棘手的部分/命令,我将不胜感激。
附言要查看表格中的完整操作列表,请查看照片。
最佳答案
mov [ebx], eax -> answer: [0x100000] 0x40000
这不会改变 EAX
或 EBX
的值。只有 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。
这不是一个太难的练习!只需考虑每个操作的作用(在手册中查找),然后进行数学计算。
关于assembly - 如何验证 x86 命令的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37904589/