assembly 汇编程序未打印读取字符串

zlhcx6iw  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(98)

我写了下面的代码,允许用户输入一个数字并将其打印出来

.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

我到底做错了什么?

r6hnlfcb

r6hnlfcb1#

num dw dup 5(?)

这是一个奇特的语法。它能组装起来吗?
通常的写法是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     db      6, 0, 6 dup (0)

由于实际字符从num + 2开始,这将是您需要传递给DOS.PrintString函数09 h的地址。
byte24hnot found after 2000 bytes.
然后还有一个小问题,就是$-终止字符。简单地将回车字节(13)替换为$字符。$字符的ASCII码是24 h(36)。

xor     bx, bx
mov     bl, [num+1]             ; The count obtained from DOS
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,

输入

2019

之后

'2' '0' '1' '9' CR
num     6, 4, 50, 48, 49, 57, 13, 0

打印

'2' '0' '1' '9' '$'
num     6, 4, 50, 48, 49, 57, 36, 0
              ^
              DX

相关问题