[英]Why doesn't this assembly code print the top of the stack?
成功制作了“ 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希望打印該字符串的地址 。 因此,您需要mov rdx, rsp
。
應該解決的另一件事:在調用之前,堆棧應對齊16個字節,並且堆棧頂部應有32個字節的空白空間。 推送后,輸入sub rsp, 40
。 然后使用rsp+40
作為要打印的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.