当访问
中的数据时,我遇到了一些问题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格式)
这里发生了什么? 怎么解决这个问题?
谢谢
克里斯