64-битный Hello world зависает после компиляции - PullRequest
0 голосов
/ 09 марта 2020

Программа компилируется, но зависает после запуска. Если заменить формат и включить 32-битные версии или закомментировать MessageBox, то все работает нормально.

format PE64 GUI

include 'E:\Fresh\include\win64a.inc'

entry start

section '.data' data readable writeable

        text db 'Hello world!',0

section '.text' code readable executable
start:
        invoke MessageBox,0,text,text,0
        invoke ExitProcess,0

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL', user32, 'USER32.DLL'
        import kernel32, ExitProcess, 'ExitProcess'
        import user32, MessageBox, 'MessageBoxA'  

1 Ответ

4 голосов
/ 09 марта 2020

Ваш стек не выровнен до 16 байтов, поскольку для ABI требуется . Добавьте and rsp, -16 в начало вашего кода, и он будет работать.

По поводу этого обмена в комментариях:

Руслан: Как выглядит разборка? Макросы invoke развернуты как положено?

rancid_rot: Не уверен, что MessageBox в cs вместо ds. И mov rcx, 0 вместо pu sh 0.

Я бы рекомендовал избегать invoke и подобных макросов, пока вы не узнаете, к чему они должны расширяться. В противном случае вы думаете, что пишете на ассемблере, но на самом деле вы пишете на высокоуровневом языке, только напоминающем ассемблер, даже не зная, какой код вы получите в итоге - таким образом бросая вызов всей цели использования ассемблера.

Чтобы на самом деле научиться вызывать функции в сборке Win64, см. Документацию по соглашениям о вызовах Win64 .

...