@caratovchanin

FASM Что не так с процедурой?

Решил разобраться в ассемблере(выбрал FASM тк просто всё работает из под коробки), в ходе написание "Hello World!" возник вопрос, а почему собственно не работаем имея следущий код,
entry main
 
include 'win64a.inc'
 
 
section '.data' data readable writeable
    hello2 db 'hello world!',0 
 
section '.bss' data readable writeable
    StandardHandle rd 1
    Written rd 1
 
section '.code' code readable writeable executable
 
main:
    stdcall test_proc, 11
    invoke ExitProcess, 0
 
 
proc test_proc, ms
    invoke GetStdHandle, STD_OUTPUT_HANDLE
 
    mov [StandardHandle], eax;getting handle
 
 
    push rbx
 
    invoke WriteFile, [StandardHandle], hello2, 1, Written, 0
    mov rbx, qword ptr ms
    invoke WriteFile, [StandardHandle], hello2, 2, Written, 0
    invoke WriteFile, [StandardHandle], hello2, rbx, Written, 0
    invoke WriteFile, [StandardHandle], hello2, 3, Written, 0
 
    pop rbx
 
    ret
endp
 
section '.idata' data import readable
        library kernel, 'kernel32.dll'
 
        import kernel,\
                GetStdHandle, 'GetStdHandle',\
                ExitProcess, 'ExitProcess',\
                WriteFile, 'WriteFile'

Он доходить до 3 вызова WriteFile и на нём не чего не выводит, хотя сдещий вывод сробатвает. Самая соль в том что регист rbx не является пустым, в него записанно непонятное значение(не то что мы передали). Ни чего не могу понять...
  • Вопрос задан
  • 79 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Что не так с процедурой?

stdcall test_proc, 11
…
proc test_proc, ms
…
mov rbx, qword ptr ms


ABI вызова не совпадает с ABI процедуры: 64-битный stdcall передаёт первый параметр в rcx, а test_proc ожидает его на стеке, в чём легко убедиться пропустив результат через objdump:

403004:       48 c7 c1 0b 00 00 00    mov    $0xb,%rcx
40300b:       e8 19 00 00 00          callq  0x403029
…
40307b:       48 8b 5d 10             mov    0x10(%rbp),%rbx
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы