assembly - 如何验证 x86 命令的输出?

标签 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 命令在 xor edx, edx 命令中将寄存器设置为“0”。

如果您更正我的结果并解释棘手的部分/命令,我将不胜感激。

附言要查看表格中的完整操作列表,请查看照片。

table with x86 operations

最佳答案

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。


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

关于assembly - 如何验证 x86 命令的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37904589/

相关文章:

c - 内联汇编 - 无用的中间复制指令

linux - 在没有 printf 的 NASM 中打印 ARGC

assembly - 页面结构缓存性能事件

组装键盘IO口

assembly - 在一条指令中使用与操作数相同的寄存器是否合法?

Android 首次打开应用程序时的说明?

assembly - 当使用多个数据库声明时,NASM 编译 x86_64 ASM 标签地址在 Mach-O 中减少 256 个字节?

math - 快速反范数函数

c - IA32 到 Y86 汇编代码转换

C内联汇编帮助(digital mars c编译器)