Данные в сегменте данных недоступны
У меня есть некоторые проблемы при доступе к данным, когда они находятся в
section .data
Я написал небольшую программу на ассемблере (с использованием NASM), которая состоит из загрузчика, который загружает некоторый код "ядра". Этот код ядра затем выполняется после загрузки в память.
Сначала я покажу код, а затем сформулирую свою проблему.
Первая часть программы состоит из начальных утверждений и определений данных:
org 7C00h
jmp _start
OS_LOCATION equ 0x7E00
STACKSEG equ 0xCE00
STACKSIZE equ 8192
DRIVE_NR equ 80h
NO_ERROR equ 0
BOOT_ERROR equ 1000
PINK equ 0dh
YELLOW equ 0eh
WHITE equ 0fh
letterB db 'B'
;=============================================================================
;section .data ;A PROBLEM OCCURS WHEN I UNCOMMENT THIS LINE (SEE LATER)
letterD db 'D'
Вторая часть - это код загрузчика:
;=============================================================================
segment .text
_start:
cli
mov ax, cs
mov ds, ax ; DS = CS
mov es, ax ; ES = CS
mov ax, STACKSEG
mov ss, ax ; SS = STACKSEG
mov sp, ax
add sp, STACKSIZE
mov bp, sp
sti
;-----------------------------------------------------------
; Display tests
;-----------------------------------------------------------
mov ax, 0B800h
mov es, ax
mov di, (160 * 0) + (2 * 0) ; Row and Column
mov ah, PINK ; Attribute byte
mov al, 'A' ; load immediate
mov [es:di], ax ; OK: A IS DISPLAYED
mov ax, 0B800h
mov es, ax
mov di, (160 * 0) + (2 * 1) ; Row and Column
mov ah, PINK ; Attribute byte
mov al, byte [letterB] ; load from memory
mov [es:di], ax ; OK: B IS DISPLAYED
;-----------------------------------------------------------
; Load OS
;-----------------------------------------------------------
mov ax, OS_LOCATION
mov es, ax
mov bx, 0
push dword 4 ; # sectors
push dword 2 ; start sector
call loadSector
cmp ax, BOOT_ERROR
jnz _startOS
_reboot:
mov ah, 0
int 16h
db 0x0ea
dw 0x0000
dw 0xffff
;-----------------------------------------------------------
; Start OS
;-----------------------------------------------------------
_startOS:
jmp OS_LOCATION:0000 ; jump to our os
;***************************************************************************
loadSector:
push ebp
mov ebp, esp
pushad
mov ah, 2
mov al, [ebp+10] ; # sectors
mov ch, 0 ; track
mov cl, [ebp+6] ; start sector
mov dh, 0 ; head
mov dl, DRIVE_NR ; drive nr (NOK: 81h, 0h)
int 0x13
jc _err_loadSector
popad
mov ax, NO_ERROR
jmp _exit_loadSector
_err_loadSector:
popad
mov ax, BOOT_ERROR
_exit_loadSector:
mov esp, ebp
pop ebp
ret 8
;***************************************************************************
times 512d - 2 - ($ - $$) db 0 ;Zerofill up to 510 bytes
dw 0AA55h ;Boot Sector signature
Последняя часть состоит из очень простого кода "ядра" (туда, куда скачет загрузчик при выполнении jmp OS_LOCATION:0000)
;-----------------------------------------------------------
; More display tests
;-----------------------------------------------------------
mov ax, 0B800h
mov es, ax
mov di, (160 * 2) + (2 * 0) ; Row and Column
mov ah, YELLOW ; Attribute byte
mov al, 'C' ; load immediate
mov [es:di], ax ; OK: C IS DISPLAYED
mov ax, 0B800h
mov es, ax
mov di, (160 * 2) + (2 * 1) ; Row and Column
mov ah, YELLOW ; Attribute byte
mov al, byte [letterD] ; load from memory
mov [es:di], ax ; D IS DISPLAYED ONLY IF 'section .data' IS COMMENTED
Пока что за код.
Теперь вышеприведенный код работает, когда я определяю 'letterD' НЕ в разделе данных:
;section .data ; IT WORKS WHEN THIS LINE IS COMMENTED
letterD db 'D'
-> Код загрузчика отображает: AB
-> Код ядра отображает: CD
Проблема, однако, заключается в том, когда я определяю 'letterD' в разделе данных:
section .data ; IT DOESN'T WORK WHEN THIS LINE IS UNCOMMENTED ???
letterD db 'D'
-> Код загрузчика отображает: AB
-> Код ядра отображает: C
Буква "D" НЕ отображается
Это как если бы данные не могли быть найдены при размещении в разделе данных. (К вашему сведению: nasm создает мой код в формате BIN)
Что здесь происходит? Как это решить?
благодарю вас
Крис