2013-03-17 59 views
3

我在x86彙編語言中有一個簡單的程序。它應該直接打印一個字符串到沒有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 

但它不起作用。你可以幫我嗎?

回答

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 ; 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 
+0

非常感謝。但是,如果我不知道它的長度,是否有一些問題可以幫助我打印一個字符串? (不使用'cmp'和'jmp'命令)? – Vanzef 2013-03-18 15:51:59

+0

@Vanzef對不起,你能更具體嗎?你的意思是什麼?你想打印ASCIIZ字符串(零端ASCII字符串)還是別的?如果我的問題解決了您的原始問題,請將其標記爲已接受的答案(綠色標記變爲可見),然後發佈有關當前問題未涵蓋的問題的新問題。 – nrz 2013-03-18 16:58:37

0

對於repnz前綴,您必須首先將cx寄存器設置爲字符數,並且由於nrz指出不應該使用該字符,因爲在遇到零時它會停止。

相關問題