2011-02-03 51 views
0

這裏是代碼:需要一些幫助打印字符串ASM程序

.model tiny 

; assemble me this way 
; ml /AT /c /Zm /coff /omf <file name> 

; link me this way 
; link2 /TINY <obj name> 

COMSEG SEGMENT 
org 7C00h 

.code 
start: 
    MyStr BYTE "HelloWorld", '$' 

    cld  ; Clear Direction Flag 
    mov si, offset MyStr 
whileloop: 
    lodsb     ;; While Hello[Si] != '$' 
    cmp al, '$' 
    jne doproc 
    jmp endwhileloop 
    doproc: 
     mov ah, 0ah   ;;  Video operation in Ah to write 
          ;;   character in Al to screen. 
     mov bh, 0   ;;  Alpha page 0 
     mov cx, 1 
     int 10h  
     jmp whileloop 
endwhileloop: 
    jmp $     

    db 510-($-start) dup (0) ;Loads of zeroes 
    dw 0AA55h 

end start 
COMSEG ENDS 

此代碼只打印垃圾到命令提示符。 MASM,Windows XP,在16位虛擬機下運行。如果有人能幫我正確地在屏幕上打印字符,那就太好了。

回答

1

我對此有點生疏 - 但是,儘管您在「微型」模型中編程,但您並不確保DS(數據段)寄存器指向數據實際所在的內存段。

如果是,迫使DS =輸入你的循環應該使上述工作的代碼CS之前 - 只是做 :行:

push CS 
pop DS 

的「while循環」之前。

我不記得INT 10h調用來檢查它們是否正常,我假設你已經在那裏設置了正確的參數)。除此之外,您可能對MASM的特定語法有問題,我無法幫助解決這個問題。

0

我的組件是有點生疏,但你可以使用DOS系統調用打印字符串:

mov dx, offset MyStr 
mov ah,9 
int 21h 

如果你真的想使用的BIOS程序,我想你需要加載ah寄存器0eh,而不是0ah。

+0

所以我試圖用0eh加載ah寄存器來使用BIOS例程,它仍然會打印垃圾。有沒有任何理由不使用DOS系統調用?我正在寫一個引導程序,所以使用DOS系統調用會導致任何問題? – TheFuzz 2011-02-03 05:00:06