Звуковой загрузчик (Intel x86)

#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