使用变量进行装配

时间:2012-09-30 07:27:09

标签: assembly x86 nasm

我正在尝试打开文本屏幕' h'它存储在一个变量中。我正在使用NASM。 x86保护模式,一个从零开始的内核。

DisplayMessage:
        ;mov byte[Color], 0xF
        ;mov CFC, EAX;
        ;mov byte[Color], 104
        ;push 104
        ;mov byte[esi], Msg
        ;lodsb
        mov ebx, Msg
        add ebx, 4
        mov [Msg], eax
        mov byte[0xB8000], Msg
        ;mov byte[eax], Color
        ;pop byte[0xB8000]
        ;mov byte[0xB8000], byte Color
        ;mov byte[0xB8000], 0xB500000;
        ;Now return
        ret
EndCode:
Msg: db 104

它显示的字母永远不对。什么是正确的方法呢?

2 个答案:

答案 0 :(得分:9)

    mov ebx, Msg ; this loads ebx with the address of Msg, OK
    add ebx, 4 ; this increments the address by 4, OK, but why?
    mov [Msg], eax ; this stores eax into the first 4 bytes of Msg, OK, but why?
    mov byte[0xB8000], Msg ; this writes the least significant byte of the
                           ; address of Msg to the screen, not OK.
                           ; Does not make any sense.

为什么不呢?:

mov al, [Msg]
mov [0xB8000], al

这应该在屏幕的左上角写出Msg的第一个字符('h'具有ASCII码104,正确),当然,如果您的数据段的基地址是如果您的org是正确的,则在其细分描述符中为0。

答案 1 :(得分:0)

VGA文本模式使用地址0xB8000作为uint16_t的数组,其中高字节用于颜色,低字节用作字符代码。目前,您将字符存储在高位字节中,而低位字节则不受影响。可能是随机噪声打印随机字符。试试这个:

DisplayMessage:
mov al, byte [msg]
mov ah, 0x0F ;White Text on Black Background
mov word [0xB8000], ax
ret