不使用OS打印字符串

时间:2013-03-17 15:54:19

标签: assembly x86 bootloader x86-16

我有一个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 个答案:

答案 0 :(得分:4)

有一些问题:

  1. 没有sdl这样的说明。

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

  3. 您需要在cx之前设置rep movsw

  4. 您需要在视频内存的每个其他字节中定义每个字符的颜色,要么是要使用rep movsw复制的数据,要么是内部复制循环。下面的代码说明了两个选项:

  5. 修改:添加了代码。

    [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
    

答案 1 :(得分:0)

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