我编写了以下代码,允许用户输入数字并打印回去
.model tiny
.stack 100
.data
userMsg db 13,10, 'Please enter a number: $'
dispMsg db 13,10, 'You have entered: $'
num dw dup 5(?)
.code
mov ax,@data
mov ds,ax
lea dx,userMsg
mov ah,9
int 21h
mov ah,0ah
lea dx,num
int 21h
lea dx,dispMsg
mov ah,9
int 21h
lea dx,num
mov ah,9
int 21h
mov ah,4ch
int 21h
但是,它不会显示用户号码,但会显示以下错误:
INT 21h, AH=09h
address: 07131
byte 24h not found after 2000 bytes.
; correct example of INT 21h/9h:
mov dx, offset msg
mov ah,9
我到底在做什么错?
答案 0 :(得分:1)
num dw dup 5(?)
这是一种特殊的语法。组装完了吗?
编写此代码的常用方法是num dw 5 dup (?)
,因此请将重复计数放在dup
运算符之前。
关于打印您在评论中说过的用户号码的问题
感谢我添加了$,并且现在正在打印
我严重怀疑打印的内容是输入的数字,而不是其他任何东西,因为您错误地使用了DOS功能09h和DOS功能0Ah!
DOS.BufferedInput函数0Ah希望从DS:DX
中获得一个指针,该指针指向具有明确定义的布局的结构。
第一个字节必须指定从第三个字节开始的存储空间有多大。
第二个字节用于DOS,以通知您输入了多少个字节。
这是一个允许输入5个字符的示例。你为什么要问我必须写6?嗯,DOS总是在输入的字符后附加一个回车字节(13)。您在第1个字节中的计数必须使之成为可能。
num db 6, 0, 6 dup (0)
由于实际字符始于num + 2
,因此这就是您需要传递给DOS.PrintString函数09h的地址。
然后还有一个以$终止字符的小问题。只需用$字符替换回车字节(13)。
xor bx, bx
mov bl, [num+1] ; The count that DOS gave to you
mov byte ptr [num+2+bx], '$'
mov dx, offset num+2
mov ah, 09h
int 21h
num 6, 0, 0, 0, 0, 0, 0, 0,
2 0 1 9
num 6, 4, 50, 48, 49, 57, 13, 0
num 6, 4, 50, 48, 49, 57, 36, 0
^
DX