windows - 为什么这段汇编代码不打印栈顶?

标签 windows assembly x86-64

成功制作“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 被替换了。我尝试了多种方法,例如 rspesprsiesirsp+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/

相关文章:

assembly - 有序/无序比较是什么意思?

assembly - rax=1 的最短 Intel x86-64 操作码?

linux - sys_brk 的对齐要求是什么

c++ - 当我使用 void 函数的返回值(通过转换函数指针)时究竟会发生什么?

windows - 如何更改 Windows Unicode 语言环境/语言的默认字体

python - 安装旧版本的 scikit-learn

windows - Windows上的奇怪终端格式化

.net - 如何告诉 Windows 预取文件?

c - GCC 是如何实现变长数组的?

Cortex M0+ 跳转到用户应用程序失败