2011-02-03 57 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