本文介绍了打印而不OS字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在x86汇编语言的简单程序。它应该直接打印一个字符串显存没有OS。
I have a simple program in x86 assembly language. It should print a string directly to the video memory without OS.
[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
但它不工作。你能帮助我吗?
But it doesn't work. Can you help me?
推荐答案
有一些问题:
-
有没有这样的指令如
SDL
。
要复制的数据,你应该使用代表MOVSW
,而不是 REPNZ MOVSW
。
To copy data, you should use rep movsw
, not repnz movsw
.
您需要设置 CX
在代表MOVSW
。
您需要定义每个字符的颜色也一样,在显存的所有其他字节,无论是在与代表MOVSW
,或者要复制的数据副本里面循环。下面的code说明了两个选项:
You need to define the colors of each character too, in every other byte of video memory, either in the data to be copied with rep movsw
, or inside copy loop. The code below illustrates both options:
编辑:添加code
[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
这篇关于打印而不OS字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!