А зачем у Вас вообще include 'win32a.inc' и .code, если Вы под DOS пишете. Там никаких WinAPI и секций кода и данных нет. А вот org 100h в начале не помешал бы. Хоть fasm и может компилировать под различные системы, но оформление кода всегда разное; в википедии есть примеры для каждой из систем.
none7: Выплывает окошко: Неподдерживаемое 16-разрядное приложение.
Не удалось запустить программу или компонент "\??\C:\Users\test.com" из-за несовместимости с 64-разрядной версией Windows. Обратитесь к разработчику за версией программы, совместимой с 64-разрядной версией Windows.
Konstantin Malyarov: Ну так нельзя в 64-битной Windows запускать 16-битные приложения. Используйте DosBox или 32-битную Windows в виртуальной машине. По другому никак.
Konstantin Malyarov: Это никак не связано. Вот так выглядит HelloWorld для x64:
; Example of 64-bit PE program
format PE64 GUI
entry start
section '.text' code readable executable
start:
sub rsp,8*5 ; reserve stack for API use and make stack dqword aligned
xor r9d,r9d
lea r8,[_caption]
lea rdx,[_message]
xor rcx,rcx
call [MessageBoxW]
mov ecx,eax
call [ExitProcess]
section '.const' data readable
_caption du 'Win64 assembly program',0
_message du 'Hello, World!',0
section '.idata' import data readable
dd 0,0,0,RVA kernel_name,RVA kernel_table
dd 0,0,0,RVA user_name,RVA user_table
dd 0,0,0,0,0
kernel_table:
ExitProcess dq RVA _ExitProcess
dq 0
user_table:
MessageBoxW dq RVA _MessageBoxW
dq 0
kernel_name db 'KERNEL32.DLL',0
user_name db 'USER32.DLL',0
_ExitProcess dw 0
db 'ExitProcess',0
_MessageBoxW dw 0
db 'MessageBoxW',0
Как видишь никаких int 21h тут нет, MessageBox и ExitProcess это WinAPI. И именно работа с ними называется использованием WinAPI, а не строчка include 'win32a.inc'. А DOS-программы всегда 16-битные, в 32-битных системах они запускаются в эмуляторе. В 64-битных его вырезали под корень.
none7: то есть int 21h урезан в х64 и я не смогу им пользоваться?
Просто в отладчике int 21h вызывает ошибку.
OllyDbg v2.00.01
Access violation when reading [FFFFFFFF] - Shift+Run/Step to pass exception to the program
Не хватает прав. Просто я не знаю как их расширить. Или это не реально?
Konstantin Malyarov: Правильно сказать вырезан напрочь. Никаких прерываний вообще нет, как и доступа к I/O портам, доступа к физической памяти, даже чтение и запись виртуальной памяти допускается лишь с позволения ядра ОС и естественно никакого доступа к BIOS. Все 32/64-битные приложения взаимодействуют с ОС лишь посредством вызова WinAPI так было начиная с Windows 2000. Тогда же появился эмулятор 16-битного режима и DOS под названием NTVDM, 32/64-битные приложения же никогда не имели доступа к прерываниям DOS/BIOS.
Как минимум забыли "$" в конце строки и не уверен устанавливается ли у вас правильно DS.
Попробуйте добавить вначале mov ax, cs и mov ds, ax а также добавить $ в конец строки.