Здесь происходит несколько вещей format ELF
говорит FASM создать объектный файл Linux. Что немного странно, потому что вы бежите Windows. Но то, что заставляет это работать, - то, что SASM использует версию MinGW набора инструментов Linux g cc для создания исполняемого файла. Это означает, что вы можете написать некоторую Linux сборку, но не все может иметь синтаксис Linux.
Другая проблема заключается в том, что getch
не является POSIX, поэтому может вызывать проблемы, используйте getchar
.
И, наконец, windows не выходит из программ, используя возвращаемые значения в EAX. Из-за этого
xor eax, eax
ret
часть будет зависать в Windows. Безопасный способ сделать это - call _ExitProcess
передать его в стеке.
Похоже, что SASM ожидает ввода любого ввода в поле ввода заранее, и из-за этого не ожидает _getchar
, Я оставил это, чтобы показать, как это будет работать, если SASM не сделает этого. Выполнение аналогичного кода, собранного напрямую с использованием FASM, работает, как и ожидалось.
Собрав все это вместе, мы получим следующее:
format ELF
section '.data' writeable
msg db 'Hello, world of Flat ASM!', 0Dh, 0Ah, 00h
pkey db 'Press any key to exit ...', 0h
formatStr db "%s", 0
public _main
extrn _printf
extrn _getchar
extrn _ExitProcess
section '.text' executable
_main:
push msg
push formatStr
call _printf
push pkey
push formatStr
call _printf
call _getchar
push 0
call _ExitProcess
Я удалил код стека для простоты, поскольку это всего лишь привет мир.