执行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
命令是否将寄存器设置为&#39}。 0'是否在xor edx, edx
命令中。
如果你纠正我的结果并解释棘手的部分/命令,我将非常感激。
P.S。要查看表格中的完整操作列表,请参阅照片。
答案 0 :(得分:3)
mov [ebx], eax -> answer: [0x100000] 0x40000
这不会更改EAX
或EBX
的值。只有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中单步执行,同时观察寄存器值的变化。请参阅x86 tag wiki。
的底部 BTW,“命令”是描述x86指令的错误词。一些汇编语言显然使用“命令”作为通常术语的一部分,但x86没有。