2016-08-19 2 views
0
.model small 
.stack 
.data 
    a db "Hello$" 
    login db "Please Log in: $" 
    lg db ? 
    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 
    int 21h 
    mov lg, bl 

    mov cx, 5 
    mov si, 0 
ck: 
    mov ah, 02h 
    mov dl, [a+si] 
    mov bl, [lg+si] 
    cmp dl, bl 
    je hi 
    int 21h 
    inc si 
    loop ck 
    jne bye 


hi: 
    mov ah, 09h 
    lea dx, helloMsg 
    int 21h 

bye: 
    mov ah, 4ch 
    int 21h 



main endp 
    end main 

Я попытался войти в систему и с помощью команды cmp сравнить вход и идентификатор объявить «Привет», я не знаю, что не так с моей кодировкой, здесь нельзя сравнивать. От дипломного студентаРегистрация языка Проверка Вход

+0

Мне нужна помощь ... – NoName

+0

Могу ли я спросить любого другого с помощью db 'H', 'e', ​​'l', 'l', 'o', 0 и db "Hello $" ?? – NoName

+2

Я бы рекомендовал использовать отладчик для отслеживания вашего кода. –

ответ

0

Чтобы записать строку с клавиатуры с помощью 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 

Четыре случая необходимо учитывать при сравнении:

  1. Обе строки (пользовательские и захваченные) равны. Пример: «Hello» - «Hello».
  2. Струны разные. Пример: «Hello» - «Stackoverflow».
  3. Пользовательская строка короче. Пример: «Привет» - «Хеллокс».
  4. Введенная строка короче. Пример: «Привет» - «Ад».

Предыдущая программа обрабатывает случаи 1, 2 и 4. Например, если пользователь вводит «Ад», программа обнаруживает, что обе строки - это не одно и то же.

Для случая 3, когда пользователь вводит «Hellox», программа говорит, что обе строки равны, что неверно. Это происходит потому, что цикл сравнения повторяется до тех пор, пока не закончится одна из строк, в этом случае строка пользователя заканчивается раньше (она короче). Я остану программу такой, потому что я не хочу усложнять ее, вы можете попытаться заставить ее работать для случая 3. В любом случае, если вы действительно хотите, чтобы программа обрабатывала случай 3, я сделаю это изменение, это потребует еще двух сравнений.

Смежные вопросы