В качестве курса, предложенного моим университетом, я следовал учебному пособию по написанию 16-разрядного загрузчика на ассемблере со значением http://3zanders.co.uk/2017/10/13/writing-a-bootloader/. Эта часть (часть 1) - это все, что я должен был сделать до сих пор. По сути, он ничего не делает, кроме вывода Hello World на экран.
Теперь, имея в виду, что это единственный опыт, который я имею при написании загрузчиков в Assembly (это единственный опыт, который у меня есть, точка) - теперь я должен расширить это в меню, где пользователь может выбрать один из три варианта, а затем выведите соответствующую строку, например:
What is your favourite colour?
Press 1 for red
Press 2 for green
Press 3 for blue
[user input here]
Your favourite colour is [whatever corresponding colour].
Я пытался понять, с чего начать часами. Я нашел несколько примеров меню выбора в Ассемблере, но проблема в том, что код в этих примерах не имеет никакого сходства с тем, чему этот урок здесь «научил» меня. Я чувствую, что меня заставляют совершить прыжок от простой печати Hello World на экран до создания меню, которое выводит различный вывод в зависимости от пользовательского ввода.
Это то, что у меня сейчас есть:
bits 16 ; tell NASM this is 16 bit code
org 0x7c00 ; tell NASM to start outputting stuff at offset 0x7c00
boot:
mov si,startText ; point si register to startText label memory location
mov ah,0x0e ; 0x0e means 'Write Character in TTY mode'
.loop:
lodsb
cmp al,51
je blue
cmp al,50
je green
cmp al,49
je red
or al,al ; is al == 0 ?
jz getInput ; if (al == 0) jump to halt label
int 0x10 ; runs BIOS interrupt 0x10 - Video Services
jmp .loop
getInput:
mov ah,00h
int 16h
red:
db "Your favourite colour is red",0
green:
db "Your favourite colour is green",0
blue:
db "Your favourite colour is blue",0
halt:
cli ; clear interrupt flag
hlt ; halt execution
startText:
db "",13,10
db "what is your favourite colour?",13,10
db "Press one for red",13,10
db "Press two for green",13,10
db "Press three for blue",13,10
db 13,10,0
times 510 - ($-$$) db 0 ; pad remaining 510 bytes with zeroes
dw 0xaa55 ; magic bootloader magic - marks this 512 byte sector bootable!
EDIT2:
Я еще раз обновил приведенный выше код, пытаясь реализовать то, что сказали мне и Сеп, и Джон. Я понимаю, что это не так, как должно быть, и некоторые вещи, которые мне сказали, не реализованы, потому что я пока не понимаю, как это сделать.
Проблема сейчас, я думаю, в том, что она ничего не делает после показа начальной метки startLabel. Ничего не меняется, если я нажимаю любую кнопку. Если кто-нибудь может направить меня дальше в правильном направлении, это будет высоко ценится!