我有此代码:
mov ah,9
lea dx,[100]
int 21
mov ah,0a ; input string
lea dx,[110]
int 21
mov dl,0d ; new line
mov ah,2
int 21
mov dl,0a
mov ah,2
int 21
mov cx,6
lea si,[112] ; this
mov ah,2
mov dl,[si]
int 21
inc si
loop this
我想通过计算用户输入的字符串的长度,将“ mov cx,6”变成一个变量。
我有这个: e 100'输入您的名字:$' e 110 20,0,0
(P.S。我输入了6个字符,所以在cx中输入了“ 6”) (P.S.S Im仅使用8086程序集的debug.exe)
注意:我知道我可以通过在输入的字符串上添加$并执行mov ah,9来输出字符串本身。但是,我希望它在循环中使用字符输出。
答案 0 :(得分:2)
此代码失败的原因有两个。
e 100 'enter your name: $'
和e 110 20,0,0
时, $ 将被零覆盖!更好地分配您的地址空间或缩短邮件的发送时间。CX
处理一次第一个字符。loop this
跳到lea si,[112] ; this
,所以SI
寄存器每次都会被重新加载相同的值。将目标 this 放在下方一行。我想通过计算用户输入的字符串的长度,将“ mov cx,6”变成一个变量
由于DOS已经为您提供了字符串的长度,因此无需进行任何计数。您可以通过读取提供的缓冲区的第二个字节来获取它。
mov cl, [111] ; 2nd byte contains length of inputted string
mov ch, 0 ; Make word because LOOP uses CX, no just CL
lea si, [112] ; String starts at 3rd byte
mov ah, 2 ; this
mov dl, [si]
int 21
inc si
loop this
如果您坚持不使用DOS提供的字符串长度,则可以处理字符,直到遇到终止回车符(十六进制为13或0D)为止。
mov cx, 0 ; Reset your variable
lea si, [112] ; String starts at 3rd byte
jmp that
mov ah, 2 ; this
int 21
inc cx ; Your calculated length!
inc si
mov dl, [si] ; that
cmp dl, 0D ; Terminating carriage return?
jne this ; Not yet
CX
是您的变量,具有输入字符串的长度。