这是代码:
.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位虚拟机下运行。如果有人可以帮我正确地将字符打印到屏幕上那将是很棒的。
答案 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。