раз 510-($-$$) db 0 не работает

Я изучаю загрузочные сектора. Я скачал nasm-installer-x64.exe с веб-сайта NASM. У меня операционная система win7-64bit. Когда я запускаю следующий код, он работает неправильно

mov ah, 0x0e;

mov al, the_secret;
int 0x10;

mov al, [the_secret];
int 0x10;

mov bx, [the_secret];
add bx, 0x7c00;
mov al, [bx];
int 0x10;

mov al, [0x7c1e];
int 0x10;

jmp $;

the_secret:;
    db 'X';

times 510-($-$$) db 0;
dw 0xaa55;

person Xiaosong He    schedule 17.03.2016    source источник
comment
Что заставляет вас думать, что times 510-($-$$) db 0 не работает? Мне кажется, все в порядке. Может у вас другая проблема с загрузчиком?   -  person Michael Petch    schedule 17.03.2016
comment
Большое спасибо. Файл изображения, сгенерированный из моих ассемблерных кодов, неверен. Во-первых, он содержит 526 байт, что должно быть 512 байт. Во-вторых, он заканчивается 0x5500, который должен быть 0x55aa. Я не знаю, почему это происходит...   -  person Xiaosong He    schedule 17.03.2016
comment
Я обнаружил, что явления, которые я описал выше, вызваны разницей между результатом, скомпилированным nasm, и результатом, записанным в мой файл изображения. Я использую команду nasm -f bin boot_sect.asm -o boot_sect.bin, это правильно?   -  person Xiaosong He    schedule 18.03.2016
comment
Это правильно. Если вы посмотрите внизу моего ответа, я привел пример того, как его собрать, и это соответствует тому, что я предложил. Какие команды вы используете, чтобы поместить загрузочный сектор на диск?   -  person Michael Petch    schedule 18.03.2016
comment
если у вас нет доступной команды DD, я рекомендую ее как полезный инструмент для Windows, который можно использовать для создания образов дисков. Его можно скачать отсюда: chrysocome.net/downloads/dd-0.6beta3.zip   -  person Michael Petch    schedule 18.03.2016
comment
Вы каким-то образом используете команду Windows copy для объединения файлов для создания образа диска?   -  person Michael Petch    schedule 18.03.2016
comment
Простите меня, я не создал файл изображения. То, что я сказал выше, файл изображения, на самом деле является файлом boot_sect.bin. Эмулятор ЦП, здесь я использую bochs, загрузит файл BIN для проверки моих ассемблерных кодов.   -  person Xiaosong He    schedule 19.03.2016
comment
Я также заметил, что мои коды работают хорошо после того, как я поместил ваши коды от xor ax,ax до cld перед своими кодами. Я думаю, что должен внимательно прочитать ваши Общие советы по загрузчику чтобы углубить мое понимание загрузчика. Я просто недавно заинтересовался этой областью. В любом случае, большое спасибо.   -  person Xiaosong He    schedule 19.03.2016


Ответы (1)


Я не верю, что с 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
comment
Спасибо за подробное объяснение. Мне это очень помогает, правда. - person Xiaosong He; 17.03.2016
comment
Недавно я успешно запустил ядро. После того, как я прошел через это, я понял больше об этом коде. Сегодня я обнаружил, что вы упомянули, что bh необходимо установить, поскольку он включает номер страницы. Но на самом деле я его вообще не ставил. Не могли бы вы объяснить мне об этом подробнее? Что такое номер страницы…… - person Xiaosong He; 23.03.2016
comment
Мой ответ содержит ссылку на информацию для Int 10h/ah=0eh: ctyme.com/intr/rb-0106.htm . Списки прерываний Ральфа Брауна стали стандартом для информации BIOS/DOS. По ссылке вы должны заметить, что там написано BH = page number . Потенциально у вас может быть более одной страницы видеопамяти для отображения. Страница 0 используется по умолчанию при загрузке системы. Рекомендуется установить BH равным нулю для этого вызова INT, чтобы убедиться, что вы пишете на страницу по умолчанию. Если этого не сделать, текст может не отображаться. Количество страниц ограничено, и, возможно, BH недействителен, поэтому по умолчанию используется значение 0. - person Michael Petch; 23.03.2016
comment
Я понял. Большое спасибо~ - person Xiaosong He; 24.03.2016