** Обратите внимание, что когда я говорю «программа загрузки», я не имею в виду программу, которая загружает ОС. Я имею в виду простую программу, которая запускается, когда вы запускаете компьютер, и что-то делает.
Хорошо, я не чрезвычайно разбираюсь в Assembly / NASM, но думаю, что у меня есть хороший достаточно знаний, чтобы писать простые загрузочные программы.
Ну, я думал , что у меня достаточно хорошее понимание. По-видимому, нет.
Я попробовал простую загрузочную программу, которую нашел в Интернете. Все прошло нормально (печатает букву «А»). Затем я изменил его, чтобы напечатать букву, хранящуюся в памяти. Это не удалось; вместо буквы «А» он печатает смайлик. (Клянусь, компьютер сейчас надо мной смеется.)
Это код из исходного файла:
[BITS 16] ; We start up in 16-bit real mode
[ORG 0x7C00] ; We're booted into memory at this address. (Or so I'm told)
mov ah, 0x0E ; Teletype command
mov bh, 0x00 ; Page number
mov bl, 0x07 ; Attributes (7 == white foreground, black background)
mov al, [testChar] ; Character to print; load it from the memory referenced by testChar.
int 0x10 ; Tell the BIOS to execute the teletype command.
jmp $ ; Infinite loop prevents us from going off and executing the other junk in memory
testChar db 65 ; This is the character we want to print. 'A'.
; The following code pads the rest of the outputted binary file
; and concludes it with the bootloader signature so I don't have
; to do so manually.
times 510-($-$$) db 0
dw 0xAA55
Если я заменю ' move al, [testChar] ' на ' move al, 65 ', буква' A 'напечатана правильно. Я пробовал перемещать объявление памяти, я пробовал каждую комбинацию скобок или отсутствие скобок вокруг BITS и ORG, и я пробовал увеличивать и уменьшать testChar (т.е. [testChar + 1]). Каждый раз он печатает либо смайлик, либо обратный смайлик (когда я увеличиваю testChar), либо вообще ничего (когда я помещаю объявление памяти перед кодом, вероятно, потому что код не выполняется = P). Я не могу заставить работать эту чертову штуку.
Теперь о спецификациях (потому что они, вероятно, актуальны):
Я использую Dell Latitude CPi с процессором Intel Pentium II, потому что это все, что я ' надо протестировать (я не тестирую ассемблер на своем обычном компьютере. Нет, черт возьми). Я почти уверен, что процессор x86, поскольку я запускал на нем Windows XP, Ubuntu и Arch Linux.
В настоящее время я пишу и компилирую программы для Arch Linux с помощью NASM.
Программа загрузки - это запуск с дискеты
Я использую ' nasm -f bin FILENAME ' для компиляции кода.
Затем я использую команду 'mformat' из пакета 'mtools' для AL, чтобы передать скомпилировал загрузочную программу на гибкий диск с помощью ' mformat -f 1440 -B BOOTPROGRAM A: '.
Итак, что я напортачил на этот раз? Или это проблема с моим процессором / BIOS?