首页 > 解决方案 > 汇编 - 为什么这些代码块输出不同?

问题描述

为什么这些操作的结果不一样:

str db "%d",0

mov eax, 67305985
push eax
push str
call [printf]
pop eax
pop eax

打印 67305985,就像它应该的那样

str db "%d",0

mov eax, 67305985
mov ebx, eax
shr ebx, 16
mov [esp-1], bh
mov [esp-2], bl
mov ebx, eax
mov [esp-3], bh
mov [esp-4], bl
push str
call [printf]
pop eax
pop eax

打印我不明白的 1964082724

标签: assemblyx86stacknasm

解决方案


堆栈向下增长。下面的内存ESP指向哪里可以被各种中断自由使用。

您需要保留下面的内存ESP供自己使用。只需减去 4 即可ESP

mov eax, 67305985

sub esp, 4
mov [esp], al
mov [esp+1], ah
shr eax, 16
mov [esp+2], al
mov [esp+3], ah
push str
call [printf]
pop eax
pop eax
...

如果您首先存储低字节,则不需要额外的寄存器。


推荐阅读