2015-01-18 2 views
1

Im экспериментирует с написанием загрузчика в nasm, на данный момент он просто печатает строку.nasm bootloader, почему я определяю, что такое строка?

[BITS 16] 
 
[org 0x7c00] 
 

 
myString: 
 
\t db 'Hello World', 0x00 
 

 
mov bp, 0x8000 
 
mov sp, bp 
 

 
mov bx, myString 
 
call printString 
 

 
jmp $ 
 

 
printString: 
 
\t pusha 
 
\t mov ah , 0x0e 
 
\t printStringA: 
 
\t 
 
\t mov al , [bx] 
 
\t cmp al, 0x00 
 
\t je printStringB 
 
\t 
 
\t int 0x10 
 
\t add bx, 0x01 
 
\t jmp printStringA 
 
\t 
 
\t printStringB: 
 
\t popa 
 
\t ret 
 

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

, что работает отлично, но если я двигаю определение строковое здесь:

[BITS 16] 
 
[org 0x7c00] 
 

 
mov bp, 0x8000 
 
mov sp, bp 
 

 
myString: 
 
\t db 'Hello World', 0x00 
 

 
mov bx, myString 
 
call printString 
 

 
jmp $ 
 

 
printString: 
 
\t pusha 
 
\t mov ah , 0x0e 
 
\t printStringA: 
 
\t 
 
\t mov al , [bx] 
 
\t cmp al, 0x00 
 
\t je printStringB 
 
\t 
 
\t int 0x10 
 
\t add bx, 0x01 
 
\t jmp printStringA 
 
\t 
 
\t printStringB: 
 
\t popa 
 
\t ret 
 

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

печатает мусор, им работает это в Bochs под окнами, если это помогает.

+0

думаю, что только что разобрался, процессор, вероятно, думает, что строка - это код, вызывая это и испортить вещи. если я перехожу к определению строки после бесконечного цикла, все это хорошо –

ответ

1

Вы собираете исходный машинный код. Нет разделов данных и текста. Все интерпретируется как код, включая то, что вы вставляете с помощью db. Следовательно, оба кода неверны.

Если вы закончите бесконечный цикл (как в вашем примере) или инструкцию halt, данные можно безопасно поместить после кода, поскольку он никогда не будет достигнут. В противном случае вы должны организовать передачу данных.

Вам также необходимо правильно установить регистры сегментов в начале.

Вот исправленная версия, с начала декларации данных:

[BITS 16] 
[org 0x7c00] 

;;; Set CS and DS 
jmp 0:start 

start: 
mov ax, cs 
mov ds, ax 

;;; set SP  
mov bp, 0x8000 
mov sp, bp 

;;; skip over data 
jmp L1 

myString: 
    db 'Hello World', 0x00 

L1: 

mov bx, myString 
... 

Обратите внимание, что в первом примере, данные были интерпретированы как код.

db 'Hello World', 0x00 

собран в

48 65 6c 6c 6f 20 57 6f 72 6c 64 00 

и соответствует:

dec ax 
gs insb 
insb 
outsw 
and [bx+0x6f],dl 
jc short 0x76 
fs 
db 0x00 

В результате этого запускается на выполнение перед кодом. Это просто удача, что этот фрагмент не мешает вашему коду работать.

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