Чтобы записать строку с клавиатуры с помощью int 21h
, ah=0ah
, вам необходимо объявить переменную с тремя разделами: первый байт, чтобы указать максимальное количество разрешенных символов (максимальная длина), один второй байт, где прерывание будет хранить количество символов, введенных пользователем, и массив символов, длина этого массива должна соответствовать максимально допустимым символам, плюс один, так как пользователь закончит клавишей ENTER (char 0dh = 13) , этот ключ также сохраняется.
После ввода ввода пользовательская строка (переменная a
) должна сравниваться с массивом символов (третий раздел входной переменной).
Следующий код имеет комментарии, чтобы помочь вам понять:
.model small
.stack 100h
.data
a db "Hello$"
login db "Please Log in: $"
lg db 21 ;<=== MAXIMUM NUMBER OF CHARS ALLOWED (20).
db ? ;<=== NUMBER OF CHARS THAT USER ENTERED (?).
db 21 dup(0) ;<=== ARRAY OF CHARS (FINISH WITH 0DH=13).
helloMsg db 0dh, 0ah, "Hello Message$"
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 09h
lea dx, login
int 21h
mov ah, 0ah
MOV DX, OFFSET lg ;<=== TELL INT 21H TO STORE CAPTURED STRING HERE.
int 21h
MOV SI, OFFSET LG + 2 ;<=== POINT TO THE ARRAY OF CHARS.
MOV DI, OFFSET A ;<=== POINT TO THE USER.
ck:
;CHECK END OF USER.
MOV DH, [DI]
CMP DH, '$'
JE hi ;<=== END REACHED. ALL CHARS MATCH.
;CHECK END OF INPUT.
MOV DL, [SI] ;<=== CURRENT ENTERED CHAR.
CMP DL, 13
JE bye ;<=== END REACHED. INPUT IS SHORTER.
;COMPARE CURRENT ENTERED CHAR TO CURRENT USER CHAR.
CMP DL, DH
jne bye ;<=== CURRENT CHARS ARE DIFFERENT.
INC SI ;<== NEXT ENTERED CHAR.
INC DI ;<== NEXT USER CHAR.
JMP CK ;<== REPEAT.
hi:
mov ah, 09h
lea dx, helloMsg
int 21h
bye:
mov ah, 4ch
int 21h
main endp
end main
Четыре случая необходимо учитывать при сравнении:
- Обе строки (пользовательские и захваченные) равны. Пример: «Hello» - «Hello».
- Струны разные. Пример: «Hello» - «Stackoverflow».
- Пользовательская строка короче. Пример: «Привет» - «Хеллокс».
- Введенная строка короче. Пример: «Привет» - «Ад».
Предыдущая программа обрабатывает случаи 1, 2 и 4. Например, если пользователь вводит «Ад», программа обнаруживает, что обе строки - это не одно и то же.
Для случая 3, когда пользователь вводит «Hellox», программа говорит, что обе строки равны, что неверно. Это происходит потому, что цикл сравнения повторяется до тех пор, пока не закончится одна из строк, в этом случае строка пользователя заканчивается раньше (она короче). Я остану программу такой, потому что я не хочу усложнять ее, вы можете попытаться заставить ее работать для случая 3. В любом случае, если вы действительно хотите, чтобы программа обрабатывала случай 3, я сделаю это изменение, это потребует еще двух сравнений.
Мне нужна помощь ... – NoName
Могу ли я спросить любого другого с помощью db 'H', 'e', 'l', 'l', 'o', 0 и db "Hello $" ?? – NoName
Я бы рекомендовал использовать отладчик для отслеживания вашего кода. –