我有一个简单的x86汇编语言程序,它应该直接将字符串打印到视频内存而无需操作系统。
[bits 16]
[org 0x7c00]
mov ax, 0x3
int 0x10
sdl
mov ax, 0xb800
mov es,ax
mov si, msg
xor di, di
repnz movsw
jmp $
msg db 'Hello'
times 510 - ($ - $$) db 0
dw 0xaa55
但它不起作用。你能帮我吗?
我有一个简单的x86汇编语言程序,它应该直接将字符串打印到视频内存而无需操作系统。
[bits 16]
[org 0x7c00]
mov ax, 0x3
int 0x10
sdl
mov ax, 0xb800
mov es,ax
mov si, msg
xor di, di
repnz movsw
jmp $
msg db 'Hello'
times 510 - ($ - $$) db 0
dw 0xaa55
但它不起作用。你能帮我吗?
以下是一些问题:
没有 sdl
这样的指令。
要复制数据,应该使用 rep movsw
,而不是 repnz movsw
。
在使用 rep movsw
之前,需要设置 cx
的值。
还需为每个字符定义颜色,在每个视频内存字节中的另一个字节中,可以在准备复制的数据中使用 rep movsw
,或者在复制循环内部进行定义。下面的代码演示了这两种选项:
编辑: 添加了代码。
[bits 16] [org 0x7c00]
mov ax,3 int 10h push word 0xb800 pop es push cs ; 以防万一,对于 bootloader 代码, pop ds ; 需要 movsb
xor di,di mov si,msg mov cx,msg_length_in_bytes
one_color_copy_to_vram_loop: movsb mov al,0x0f stosb loop one_color_copy_to_vram_loop mov si,multicolor_msg mov cx,multicolor_msg_length rep movsw
jmp $
msg db 'Hello' msg_length_in_bytes equ $-msg
multicolor_msg db ' ',0 db 'H',1 db 'e',2 db 'l',3 db 'l',4 db 'o',5 db ' ',0 db 'w',6 db 'i',7 db 't',8 db 'h',9 db ' ',0 db 'c',10 db 'o',11 db 'l',12 db 'o',13 db 'r',14 db '!',15 multicolor_msg_length equ ($-multicolor_msg)/2
使用repnz
前缀时,必须首先将cx
寄存器设置为字符计数,并且正如nrz所指出的那样,不应该使用它,因为它会在遇到零时停止。