2016-03-14 3 views
1

Я следую за книгой Написание простой операционной системы - от Scratch от Nick Blundell. Я пытаюсь выполнить задачу на странице 21. Я написал простую программу для проверки того, как инициализированные данные будут работать в файлах bin. Вот программа:NASM инициализированные данные в файлах bin, кажется, не работают

hello.asm

section .data 

test: db  'A' 

section .text 


     mov  ah,0x0e 
     mov  al,[test] 
     int  0x10 

     jmp  $ 


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

затем скомпилировать я это сделать:

nasm hello.asm -f bin -o hello.bin 

бежать:

qemu-system-i386 hello.bin 

Проблема, выход ожидается является символом «А», но я получил символ «S»

Выход:

enter image description here

Я предполагаю, что метка test не работает должным образом, но я не знаю, почему

+0

Вы хотите объединить свои данные и текстовый раздел в один. Поэтому поместите свои данные в текстовый раздел после кода (но перед сигнатурой загрузочного сектора). Если вы этого не сделаете, ваш раздел кода будет в первых 512 байт, и данные начнутся с байта 513, который вам не нужен. Также вы должны указать правильную точку начала (например: 'org 0x7c00'), так как вы пишете загрузчик. Вы также захотите установить регистрацию _DS_ в ноль в начале. –

+1

Спасибо, это работает, и мне не нужно было устанавливать регистра DS на ноль – gabriel80546

+0

Это работает, потому что во многих средах _DS_ часто бывает 0 до запуска вашего загрузчика.Это не гарантируется, поэтому рекомендуется сделать это явно. Это можно сделать с помощью кода типа xor ax, ax'' mov ds, ax'. «Xor ax, ax» - эффективный способ установить регистр (в данном случае _AX_) на 0. –

ответ

0

При использовании NASM с опцией -f bin, секция .text будет отображаются в плоском двоичном файле до раздела .data. Из-за этого, если вы скомпилируете свой код, первые 512 байтов будут содержать сегмент кода (.text), и данные появятся после первых 512 байт. Вы хотите, чтобы ваши данные в первых 512 байтах использовались в этом загрузчике. С -f bin и загрузчиками лучше всего удалить раздел .data и поместить данные после кода, но перед сигнатурой загрузчика.

Вы также должны установить исходную точку с помощью директивы ORG. Загрузочные загрузчики загружаются в память по физическому адресу 0x07c00 или CS: IP 0x0000: 0x7c00 (или другой эквивалент segment offset pairs). Самый простой способ - использовать org 0x7c00 в верхней части кода. Это приведет к смещениям и меткам относительно 0x7c00. По умолчанию для NASM с использованием опции -f bin используется точка начала 0x0000.

Если вы используете org 0x7c00, то для правильного доступа к данным в памяти вам необходимо использовать 0 0 0 0 0 0 0 0 0 0

Ваш код мог бы выглядеть следующим образом:

org 0x7c00 

section .text 

     xor  ax,ax 
     mov  ds,ax  ; DS = AX = 0 
     mov  ah,0x0e 
     mov  al,[test] 
     int  0x10 

     jmp  $ 

test: db  'A' 

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

Это, как правило, хорошая идея, чтобы создать стек, а также. У меня есть ответ Stackoverflow с некоторыми general bootloader tips, которые могут быть полезны.

 Смежные вопросы

  • Нет связанных вопросов^_^