#assembly #nasm #x86-16 #bootloader #bios
#сборка #nasm #x86-16 #загрузчик #bios
Вопрос:
Я, наконец, понял основы сборки и простого программирования. Или, по крайней мере, это то, что я думал. Я написал это (сам в первый раз :))
[BITS 16]
[ORG 0X7C00]
Yaz: MOV SI, Msa
MOV AL, [SI]
INC SI
INT 0x10
OR AL, AL
JZ Yaz
JMP Halt
Halt: hlt
Msa db "Test Successful", 0
TIMES 510 - ($ - $$) DB 0
DW 0xAA55
Я записал это на USB (я хорошо знаю, что тестирование их на реальном оборудовании не такая уж хорошая идея) и перезагрузился. BIOS выполнил свои тесты и загрузился в мой загрузчик (или, скорее, «программу», поскольку на самом деле она не загружается sth). Он ничего не распечатал, и мой компьютер начал подавать звуковой сигнал.
Я отключил защиту от вирусов загрузочного сектора, быструю загрузку, я буквально перепробовал все, но каждый раз, когда я загружаюсь в свою программу, она просто подает звуковой сигнал мне в лицо, пока я не нажму CTRL ALT УДАЛИТЬ из нее.
Что я сделал не так? Заранее спасибо.
Комментарии:
1. Возможно, стоит попробовать это: capp-sysware.com/misc/stackoverflow/40143596/boot.asm . Но я подозреваю, что, поскольку вы не настроили DS (установите его равным нулю), это может быть проблемой (чтение строки из неправильного сегмента), и вы не заканчиваете бесконечным циклом. Думаю, вам нужно двигаться
JMP Halt
послеHalt: hlt
. Поскольку у вас нет надлежащего бесконечного цикла, возможно, он запускал все, что оказалось в памяти послеhlt
.2. Возможно, полезно указать вашу материнскую плату, поскольку звуковые коды обычно имеют значения, зависящие от производителя, которые могут помочь при отладке.
3. Кроме того, я на самом деле не вижу, чтобы вы устанавливали AH (подфункцию Int 10h), которая предполагается для печати. Я думаю, вы хотите ввести 0eh в регистр AH , чтобы использовать вывод TTY BIOS . Также вы должны проверять наличие NUL (0) перед печатью, а не после.
4. Вместо перезагрузки компьютера вы можете для начала рассмотреть возможность тестирования в эмуляторе или виртуальной машине. Этот код также должен был не работать в этих средах (хотя сбой мог проявиться по-другому). QEMU, Bochs, VirtualBox и т.д. — это некоторые хорошо известные и свободно доступные эмуляторы и виртуальные машины.
5. Если у вас есть ответ на ваш вопрос, пожалуйста, ответьте на вопрос, не изменяйте исходный вопрос с помощью решения. Я отменил ваше изменение и создал ответ из вашей последней правки.
Ответ №1:
После просмотра комментариев рабочий код, который не подает звуковой сигнал на мой компьютер, а вместо этого выводит строку, которую я искал:
org 7c00h
bits 16
main:
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 7c00h
cld
xor bx, bx
mov si, MESAJ
call yaz
cli
durdur:
hlt
jmp durdur
yaz:
push ax
mov ah, 0Eh
yenikarakter:
lodsb
test al, al
je bitir
int 10h
jmp yenikarakter
bitir:
pop ax
ret
MESAJ:
db "Test basarili!", 10, 13, 0
times 510-($-$$) db 00h
dw 0xAA55