【发布时间】:2019-03-10 18:41:46
【问题描述】:
成功发出“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,但我想学习如何这样做。)
【问题讨论】:
-
print rax, rsp, 1应该可以工作。发生了什么?请注意,您没有遵循标准调用约定,尤其是阴影空间和堆栈对齐要求。 -
@Jester 是的,我是组装新手,所以我不确定如何正确地做事。