Подсчитайте длину строки и добавьте к cx - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть этот код:

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

(PS Я поставил «6» в cx, потому что я ввел 6 символов) (PSS Im только с использованием debug.exe из8086 сборка)

Примечание: я знаю, что могу просто вывести саму строку, добавив $ к введенной строке и выполнив mov ah, 9.Но я хочу использовать вывод символов с циклом.

1 Ответ

0 голосов
/ 03 марта 2019

Существует 2 причины, по которым этот код не будет работать.

  • Вы уничтожаете символ $ , который завершает исходное сообщение.
    При вводе команд e 100 'enter your name: $'и e 110 20,0,0 подряд строка $ будет заменена на ноль!Лучше освободить адрес или сократить сообщение.
  • Вы продолжаете обрабатывать только первый символ CX раз.
    Поскольку loop this переходит на lea si,[112] ; this, регистр SI будет перезагружен содно и то же значение каждый раз.Поместите цель this , на одну строку ниже.

Я хочу сделать это "mov cx, 6" в переменной путем подсчета длины строкивведено пользователем

Не нужно ничего подсчитывать, так как DOS уже дал вам длину строки.Вы можете получить его, прочитав 2-й байт предоставленного вами буфера.

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 - это ваша переменная, которая имеет длину введенной строки.

...