Почему этот ассемблерный код не печатает верхнюю часть стека? - PullRequest
1 голос
/ 10 марта 2019

После успешного создания «Привет, мир!» Программу в 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 в этом случае, но я хочу научиться делать это таким образом.)

1 Ответ

4 голосов
/ 10 марта 2019

mov rdx, [rsp] загрузит 65 в rdx.Но WriteConsole ожидает адрес строки для печати.Итак, вы хотите mov rdx, rsp.

Еще одна вещь, которая должна быть исправлена: стек должен быть выровнен до 16 байтов перед вызовом, и в верхней части стека должно быть 32 байта пустого пространства.После толчка положите sub rsp, 40.Затем используйте rsp+40 в качестве адреса для печати. ​​

...