如何验证x86指令的输出?

3

我在执行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命令是否在xor edx, edx命令中将寄存器设置为“0”。
如果您能纠正我的结果并解释其中棘手的部分/命令,我将非常感激。
附注:要查看表格中的完整操作列表,请参见照片。 x86操作表

1
此外,[] 表示内存引用。mov [ebx], eaxeax 的值放置在 ebx 指向的内存位置;它不会将 ebx 设置为 eax 的值。 - zneak
2
除此之外,Stack Overflow 的主要目标是为其他人创建文档。良好的文档需要易于查找,这意味着问题需要非常具体。如果您正在谷歌搜索有关 lea 的信息,那么您很可能永远不会找到这个问题,因为它没有围绕这个词语进行表述。Stack Overflow 对问题的措辞非常严格,我们都明白您希望我们检查您的结果,但是当前的文档价值(如当前措辞)很低,人们可能不会回答。 - zneak
@zneak 谢谢您的建议。我是 Stack Overflow 的新手,虽然我已经阅读了说明,但并不清楚应该如何表达我的问题。 - cbx44
@osgx,我尝试纠正我的问题和值,以便现在不会存在歧义。 - cbx44
从你的问题中并不清楚“上一条指令的结果”是否对“下一条指令的输入”有影响,这会带来很大的变化! - Sep Roland
显示剩余6条评论
2个回答

3
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。


这并不是太难的练习!只需要考虑每个操作的含义(在手册中查找),然后进行计算即可。


感谢您的支持! - cbx44

1

xor相同,相同将始终将寄存器清零,这是最好的方法。

关于LEA的一个经典问答是LEA指令的目的是什么?(简而言之:它是一种移位和加法指令,使用内存操作数语法和机器编码)。


如果您想检查其他指令的答案,只需将该代码组装成可执行文件并在gdb中逐步执行,同时观察寄存器值的变化。请参见 标签wiki底部。


顺便说一下,“命令”不是描述x86指令的正确词语。一些汇编语言显然使用“命令”作为通常术语的一部分,但x86不是这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接