簡體   English   中英

為什么此匯編代碼不打印堆棧的頂部?

[英]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被替換為某些東西。 我嘗試了各種方法,例如rspesprsiesirsp+1rsp+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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM