#assembly #fasm
#сборка #fasm
Вопрос:
Я пишу «Hello, World» на консоль с DOS в FASM. Но это не работает с x64.
Я пытался написать программу для x64, но она тоже не работает.
В чем моя ошибка?
Это мой код:
format PE64
org 100h
mov ax, cs
mov ds, ax
mov dx, msg
mov ah, 9h
int 21h
mov ah, 4c00h
int 21h
msg db 'Hello, World!$'
Комментарии:
1.
format PE64
создает 64-разрядную программу Windows, без программы DOS. В программе indos вы не можете вызывать прерывания DOS, подобныеint 21h
— это приведет к сбою. Если вы хотите создать программу DOS COM, удалитеformat PE64
и замените ее наUSE16
. Это приведет к созданию программы DOS COM. Однако в 64-разрядной Windows вы не можете запускать 16-разрядные программы DOS (вы получите сообщение об ошибке). Вам нужно запускать программы DOS под эмулятором DOS, таким как DOSBox. В 32-разрядной Windows вы можете запускать программы DOS.2. Я думаю, вы также имели в виду использовать
mov ax, 4c00h
, а неmov ah, 4c00h
3. Спасибо, но как я могу использовать это без программы DOS? Если я поменяю компьютер на 32-разрядный (это x86 -> x64-> x32), сработает ли это? И если это не работает, как я могу это изменить
4. Вам пришлось бы установить 32-разрядную версию Windows для запуска 16-разрядных программ DOS. Вы не можете запускать 16-разрядные программы DOS непосредственно в 64-разрядной Windows. Вы можете написать программы PE32 и PE64, которые выполняются в 64-разрядной Windows, но там вы не можете использовать прерывания DOS. Вам пришлось бы вызвать Windows API для вывода символов на консоль.
5. Нет, вы не можете использовать прерывания DOS или BIOS в программе PE64 или PE32. Они доступны только в программах DOS, и, как я уже говорил, вы не можете запускать программы DOS в 64-разрядной Windows без эмулятора DOS, такого как DOSBox. 64-разрядная Windows больше не поддерживает запуск 16-разрядного кода в 64-разрядной ОС из-за изменения дизайна 64-разрядных процессоров.