我有一个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
但它不起作用。你能救我吗?
答案 0 :(得分:4)
有一些问题:
没有sdl
这样的说明。
要复制数据,您应使用rep movsw
,而不是repnz movsw
。
您需要在cx
之前设置rep movsw
。
您需要在视频内存的每个其他字节中定义每个字符的颜色,要么是要使用rep movsw
复制的数据,要么是内部复制循环。下面的代码说明了两个选项:
修改:添加了代码。
[bits 16] [org 0x7c00] mov ax,3 int 10h push word 0xb800 pop es push cs ; just in case, for bootloader code, pop ds ; needed for 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
答案 1 :(得分:0)
使用repnz
前缀,您必须首先将cx
寄存器设置为字符数,并且nrz指出您不应该使用那个,因为它在遇到零时停止。