本文介绍了打印而不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?

推荐答案

有一些问题:


  1. 有没有这样的指令如 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字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-23 06:16