在ASM程序中需要一些帮助打印字符串

时间:2011-02-03 02:32:39

标签: string assembly character

这是代码:

 .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

此代码仅向cmd提示符打印垃圾。 MASM,Windows XP,在16位虚拟机下运行。如果有人可以帮我正确地将字符打印到屏幕上那将是很棒的。

2 个答案:

答案 0 :(得分:1)

我对此有点生疏 - 但是,尽管您正在使用“微小”模型进行编程,但您并不确保DS(数据分段寄存器)指向DATA实际所在的内存段。

如果是这样,在进入循环之前强制DS = CS应该使上面的代码工作 - 只是做:

push CS
pop DS 

在“whileloop:”行之前。

我不记得INT 10h的电话来检查它们是否正常,我假设你已经在那里设置了正确的参数。除此之外,您可能对MASM的特定语法有疑问,我无能为力。

答案 1 :(得分:0)

我的程序集有点生疏,但您可以使用DOS系统调用来打印字符串:

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

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