我写了下面的代码,允许用户输入一个数字并将其打印出来
.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
我到底做错了什么?
1条答案
按热度按时间r6hnlfcb1#
这是一个奇特的语法。它能组装起来吗?
通常的写法是
num dw 5 dup (?)
,所以把重复计数 * 放在dup
运算符之前。关于打印您在评论中说的用户号码的问题:
谢谢,我已经添加了$,现在正在打印
我严重怀疑打印出来的是输入的数字,而不是别的,因为你错误地使用了DOS函数09 h和DOS函数0Ah!
DOS.BufferedInput函数0Ah期望从您那里获得
DS:DX
中的指针,该指针指向具有明确定义的布局的结构。第一个字节必须指定从第三个字节开始的存储空间有多大。
第二个字节是DOS用来通知你输入了多少字节。
有关此DOS功能的更多信息,请阅读How buffered input works。
接下来是一个允许输入5个字符的例子。你会问,为什么我必须写6个呢?好吧,DOS总是在输入的字符后附加一个回车字节(13)。你在第一个字节的计数必须允许这一点。
由于实际字符从
num + 2
开始,这将是您需要传递给DOS.PrintString函数09 h的地址。byte24hnot found after 2000 bytes.
然后还有一个小问题,就是$-终止字符。简单地将回车字节(13)替换为$字符。$字符的ASCII码是24 h(36)。
之前
输入
2019
之后
打印