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

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

4

2 回答 2

4

有一些问题:

  1. 没有这样的指令sdl

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

  3. cx之前需要设置rep movsw

  4. 您还需要在视频内存的每隔一个字节中定义每个字符的颜色,或者在要复制的数据中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
于 2013-03-17T17:02:25.267 回答
0

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

于 2013-03-17T17:00:07.213 回答