数据段中的数据无法访问

时间:2015-02-18 16:29:25

标签: assembly x86 nasm data-segment

当访问

中的数据时,我遇到了一些问题
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格式)

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

谢谢

克里斯

0 个答案:

没有答案