计算字符串的长度,然后添加到cx

时间:2019-02-23 16:06:30

标签: assembly x86-16

我有此代码:

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来输出字符串本身。但是,我希望它在循环中使用字符输出。

1 个答案:

答案 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是您的变量,具有输入字符串的长度。