成功制作“Hello, World!”后x86-64 中的程序,我想要
制作一个可以查看堆栈顶部的程序(无需弹出堆栈,并使用 esp
寄存器,这样我就可以了解它是如何工作的)。这是 NASM 中的程序:
extern GetStdHandle, WriteConsoleA, ExitProcess
section .bss
dummy resd 1
section .text
%macro print 3
mov rcx, %1
mov rdx, %2
mov r8, %3
mov r9, dummy
push NULL
call WriteConsoleA
%endmacro
_start:
mov rcx, STD_OUTPUT_HANDLE
call GetStdHandle
push 65
print rax, [x], 1
mov rcx, 0
call ExitProcess
NULL equ 0
STD_OUTPUT_HANDLE equ -11
在 print rax, [x], 1
行,x
被替换了。我尝试了多种方法,例如 rsp
、esp
、rsi
、esi
、rsp+1
、rsp+4
等。它们都不起作用。他们要么不编译,要么不打印任何东西。
正确的做法是什么? (注意:这仅用于实验目的。我知道在这种情况下我可以使用 push
/pop
,但我想学习如何使用这种方式。)
最佳答案
mov rdx, [rsp]
会将 65 载入 rdx
。但是 WriteConsole 需要打印字符串的 address。所以你想要mov rdx, rsp
。
另一件应该修复的事情:堆栈应该在调用前对齐到 16 字节,堆栈顶部应该有 32 字节的空白空间。推送后,放入sub rsp, 40
。然后使用rsp+40
作为打印地址。
关于windows - 为什么这段汇编代码不打印栈顶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55091070/