1

当数据位于

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' NOT 时,上面的代码有效:

;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 格式)

这里发生了什么?如何解决这个问题?

谢谢你

克里斯

4

0 回答 0