汇编程序不打印读取的字符串

时间:2019-06-12 13:10:15

标签: assembly dos x86-16

我编写了以下代码,允许用户输入数字并打印回去

.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 个答案:

答案 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