Как сравнить инициализировать строку? - PullRequest
2 голосов
/ 28 апреля 2019

У меня проблемы со сравнением строки инициализации в моей домашней работе .. Это всего лишь пример кода, и у меня возникла проблема с выводом ...

Введите ваш ответ: огурец Ваш ответ: огурец

Огурец - правильный ответ

Но это дисплей: Вы получили неправильный ответ Я действительно не понимаю, как я могу это исправить

 Data Segment      
  input db "Enter Your Answer: $"
  g db 20 dup('$') ;
  strlen1 db $-g
  str2 db 'cucumber','$'
  strlen2 db $-str2
  streq db 10,13,'You got the correct answer','$'
  struneq db 10,13,'You got the Wrong answer','$'
Data Ends
Code Segment
  Assume cs:code, ds:data
  Begin:
    mov ax, data
    mov ds, ax
    mov es, ax    
   mov ah,09h
   lea dx,input
   int 21h    
   MOV AH,0AH
   MOV DX,SI
   INT 21H     
   lea si,g
   lea di, str2
   mov cx, 3
   mov al, strlen1
   mov bl, strlen2
   cmp al, bl
   jne Not_Equal
   repe cmpsb
   jne Not_Equal
   jmp Equal
   Not_Equal:
       mov ah, 09h
       lea dx, struneq
       int 21h
       jmp Exit
   Equal:
       mov ah, 09h
       lea dx, streq
       int 21h
   Exit:
       mov ax, 4c00h
       int 21h
Code Ends

1 Ответ

0 голосов
/ 28 апреля 2019

Вы рассчитываете длину строки статически из данных в сегменте данных. Один из них составляет 20 байт, а другой - «огурец $», который намного короче. Вы должны получить длину ввода от вызова DOS, который вы используете для ввода. Я никогда не использовал 16-битную DOS, но этот сайт предлагает ссылку на то, что вы получите от звонка. Как видите, возвращаемый буфер не начинается с реальных данных, поэтому вам нужно начать чтение с нескольких байтов дальше в буфер. Кроме того, вы получаете длину, которая вам нужна.

Также имейте в виду, что repeat повторяется cx раз, поэтому для него должна быть задана длина строки (используйте strlen1, потому что strlen2 будет включать возврат каретки). Сейчас оно установлено на 3.

Надеюсь, это поможет.

Редактировать: входной буфер, переданный на вызов, находится в DX. Сначала вы помещаете в него букву g, но затем вы как-то перезаписываете ее си.

...