Простая «программа загрузки» NASM неправильно обращается к памяти?

** Обратите внимание, что когда я говорю «программа загрузки», я не имею в виду программу, которая загружает ОС. Я имею в виду простую программу, которая запускается, когда вы запускаете компьютер, и что-то делает.

Хорошо, я не чрезвычайно разбираюсь в 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?

5
задан AnonymousJohn 11 July 2011 в 01:13
поделиться