在没有操作系统的情况下打印一个字符串

4

我有一个简单的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

但它不起作用。你能帮我吗?

2个回答

4

以下是一些问题:

  1. 没有 sdl 这样的指令。

  2. 要复制数据,应该使用 rep movsw,而不是 repnz movsw

  3. 在使用 rep movsw 之前,需要设置 cx 的值。

  4. 还需为每个字符定义颜色,在每个视频内存字节中的另一个字节中,可以在准备复制的数据中使用 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

非常感谢。但是,如果我不知道字符串的长度,有没有一些问题可以帮助我打印一个字符串呢?(不使用'cmp'和'jmp'命令)? - Vanzef
@Vanzef 对不起,您能具体说明一下问题吗?您是想打印ASCIIZ字符串(以零结尾的ASCII字符串)还是其他什么?如果我的回答解决了您最初的问题,请将其标记为已接受的答案(绿色标记变为可见),然后发布一个新问题,涉及到当前问题未涵盖的问题。 - nrz
你不应该依赖于CS为0x0000。由于你使用的是ORG 0x7c00,所以将DS设置为0。由于你正在使用字符串指令,因此应根据代码要求显式设置DF。由于你期望向前移动,所以使用CLD。你不能依赖于BIOS清除它。 - Michael Petch

0

使用repnz前缀时,必须首先将cx寄存器设置为字符计数,并且正如nrz所指出的那样,不应该使用它,因为它会在遇到零时停止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接