Я следую за книгой Написание простой операционной системы - от 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»
Выход:
Я предполагаю, что метка test
не работает должным образом, но я не знаю, почему
Вы хотите объединить свои данные и текстовый раздел в один. Поэтому поместите свои данные в текстовый раздел после кода (но перед сигнатурой загрузочного сектора). Если вы этого не сделаете, ваш раздел кода будет в первых 512 байт, и данные начнутся с байта 513, который вам не нужен. Также вы должны указать правильную точку начала (например: 'org 0x7c00'), так как вы пишете загрузчик. Вы также захотите установить регистрацию _DS_ в ноль в начале. –
Спасибо, это работает, и мне не нужно было устанавливать регистра DS на ноль – gabriel80546
Это работает, потому что во многих средах _DS_ часто бывает 0 до запуска вашего загрузчика.Это не гарантируется, поэтому рекомендуется сделать это явно. Это можно сделать с помощью кода типа xor ax, ax'' mov ds, ax'. «Xor ax, ax» - эффективный способ установить регистр (в данном случае _AX_) на 0. –