我有一个 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 指出的那样,您不应该使用该前缀,因为它会在遇到零时停止。