Я не верю, что с times 510-($-$$) db 0
что-то не так. Мне кажется, вы пытаетесь найти правильный способ доступа к переменной the_secret
, а затем отобразить ее на экране. Я предоставлю один наиболее многообещающий механизм, основанный на этой попытке:
mov al, [the_secret];
int 0x10;
Если вы правильно настроили DS, установите исходную точку с помощью org 0x7c00
и убедитесь, что для BH задан номер страницы, на которую вы хотите записать (вы хотите 0), а затем следующее код должен работать:
[bits 16] ; 16-Bit code
[org 0x7c00] ; Set the origin point to 0x7c00
start:
xor ax,ax ; We want a segment of 0 for DS for this question
mov ds,ax ; Set AX to appropriate segment value for your situation
mov es,ax ; In this case we'll default to ES=DS
mov bx,0x8000 ; Stack segment can be any usable memory
mov ss,bx ; This places it with the top of the stack @ 0x80000.
mov sp,ax ; Set SP=0 so the bottom of stack will be @ 0x8FFFF
cld ; Set the direction flag to be positive direction
mov ah, 0x0e
mov al, [the_secret] ; al = character from memory DS:[the_secret]
xor bh, bh ; bh = 0 = video page number
int 0x10;
jmp $
the_secret:;
db 'X';
times 510-($-$$) db 0
dw 0xAA55
Код запуска устанавливает DS равным нулю, поскольку мы установили исходную точку 0x7c00. Загрузчик загружается по адресу 0x0000:0x7c00 (физический адрес 0x07c00). Это гарантирует правильный доступ к переменной the_secret
. mov al, [the_secret]
эквивалентно mov al, ds:[the_secret]
. Если регистр сегмента DS установлен неправильно, а исходная точка установлена неправильно, доступ к памяти не будет считываться из надлежащего места.
INT 0x10/AH=0x0E требует установки номера страницы. Первая страница отображения видео равна 0, BH следует установить соответствующим образом.
Дополнительные сведения о других инструкциях по настройке можно найти в моем ответе StackOverflow, который содержит Общие советы по загрузчику.
Код, который я представил, должен отображать X
в консоли, если он правильно записан в образ диска.
Чтобы собрать этот код и создать образ диска (в моем примере дискета 720 КБ):
nasm -f bin bootload.asm -o bootload.bin
dd if=/dev/zero of=disk.img bs=1024 count=720
dd if=bootload.bin of=disk.img bs=512 count=1 conv=notrunc
Первая команда собирает bootload.asm
в плоский двоичный файл с именем bootload.bin
. Вторая команда создает заполненный нулями образ диска (disk.img
) размером 1024 * 720 (дискета 720 КБ), а последняя команда копирует 512 байт данных из bootload.bin
в первый сектор образа диска. conv=notrunc
указывает DD не усекать файл после записи. Если вы оставите это выключенным, disk.img
будет иметь длину 512 байт после записи загрузочного сектора.
person
Michael Petch
schedule
17.03.2016
times 510-($-$$) db 0
не работает? Мне кажется, все в порядке. Может у вас другая проблема с загрузчиком? - person Michael Petch   schedule 17.03.2016nasm -f bin boot_sect.asm -o boot_sect.bin
, это правильно? - person Xiaosong He   schedule 18.03.2016copy
для объединения файлов для создания образа диска? - person Michael Petch   schedule 18.03.2016boot_sect.bin
. Эмулятор ЦП, здесь я используюbochs
, загрузит файл BIN для проверки моих ассемблерных кодов. - person Xiaosong He   schedule 19.03.2016xor ax,ax
доcld
перед своими кодами. Я думаю, что должен внимательно прочитать ваши Общие советы по загрузчику чтобы углубить мое понимание загрузчика. Я просто недавно заинтересовался этой областью. В любом случае, большое спасибо. - person Xiaosong He   schedule 19.03.2016