装配使用变量
我正在试图使文本屏幕打印'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
它显示的字母是不对的。 什么是正确的方法来做到这一点?
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,正确),当然,如果数据段的段地址描述符中的基地址为0,并且如果你的org
是正确的。
VGA文本模式使用地址0xB8000
作为uint16_t
的数组,高位字节用于颜色,低位字节用作字符代码。 目前您正在将字符存储在高位字节中,而低位字节未被触及。 它可能是打印随机字符的随机噪音。 尝试这个:
DisplayMessage:
mov al, byte [msg]
mov ah, 0x0F ;White Text on Black Background
mov word [0xB8000], ax
ret
链接地址: http://www.djcxy.com/p/15895.html