我有一个 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
。
cx
之前需要设置rep movsw
。
您还需要在视频内存的每隔一个字节中定义每个字符的颜色,或者在要复制的数据中rep movsw
,或者在复制循环中。下面的代码说明了这两个选项:
编辑:添加代码。
[位 16] [组织 0x7c00] 移动斧头,3 整数 10 小时 推字 0xb800 流行音乐 推cs;以防万一,对于引导加载程序代码, 流行音乐;movsb 需要 xor di,di mov si,msg mov cx,msg_length_in_bytes one_color_copy_to_vram_loop: movsb 移动,0x0f stosb 循环 one_color_copy_to_vram_loop mov si,multicolor_msg mov cx,multicolor_msg_length 代表 movsw 跳转 $ 味精数据库'你好' msg_length_in_bytes 等于 $-msg multicolor_msg 数据库 ' ',0 分贝'H',1 分贝'e',2 分贝'l',3 分贝'l',4 分贝'o',5 分贝'',0 分贝'w',6 分贝'我',7 分贝't',8 分贝'h',9 分贝'',0 分贝'c',10 分贝'o',11 分贝'l',12 分贝'o',13 分贝'r',14 分贝'!',15 multicolor_msg_length equ ($-multicolor_msg)/2
使用repnz
前缀,您必须首先将cx
寄存器设置为字符数,并且正如 nrz 指出的那样,您不应该使用该前缀,因为它会在遇到零时停止。