Написание hello, world на консоль в Fasm с DOS

#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-разрядных процессоров.