Есть ли способ CMP две строки с использованием emu8086? - PullRequest
1 голос
/ 11 апреля 2020

Я работаю над проектом по организации оценки учащихся по экзамену 3 с использованием языка ассемблера.

Я хочу, чтобы эму CMP выводила строки пользователя по текстовым файлам, поэтому если ZF установлен в 1, эму распечатает информацию о студенте (ID, полное имя, оценки за экзамены), полученную из сострадания.

Вот код, я обращаюсь к вам, ребята.

ORG 100H 
     MOV DX, OFFSET MSG1
     MOV AH, 9H
     INT 21H
     MOV DX, OFFSET MSG2
     MOV AH, 9H
     INT 21H 
     MOV DX, OFFSET LNBF  ; GET STRING FROM USER
     MOV AH, 0AH
     INT 21H  


     MOV AL, 0            ; OPEN MY FILE
     MOV DX, OFFSET FILE
     MOV AH, 3DH
     INT 21H 

     ;  READ FROM FILE
     MOV BX, AX           ; MOV HANDLER TO BX 
     MOV CX, 1            ; READ CHAR ONE BY ONE
     LEA DX, DATABF        
     INT 21H 
     RET

FILE DB "MY.txt",0
LNBF DB 1EH,? 
MSG1 DB "FIND A STUDENT BY HIS/HER LAST NAME:$"
MSG2 DB 0DH,0AH,0DH,0AH,"ENTER THE STUDENT'S LAST NAME->: $"  
DATABF DW 0FFFH

1 Ответ

0 голосов
/ 13 апреля 2020

Исправьте эти ошибки, прежде чем продолжить:

  • LNBF DB 1EH,? плохо справляется с настройкой буфера для ввода имени студента! Он перезаписывает MSG1 вместо предоставления достойного выделенного буфера.
    Правильный путь: LNBF DB 30, 0, 30 dup (0)
    Для получения подробной информации о функции DOS.BufferedInput 0Ah см. Как работает буферизованный ввод

  • Ваш код READ FRI FILE забывает указать требуемый номер функции 3Fh.
    Использовать mov ah, 3Fh. Также не следует пренебрегать возможностью возврата ошибки через флаг переноса!


Ниже приведен пример, который вы можете использовать. Он сравнивает имя с возвратом каретки в входном буфере с именем, определенным zero в текстовом файле. (Конечно, файл может использовать любой подходящий вам терминатор строки ...)

    mov si, offset LNBF + 2   ; -> SI is address of student's name.
More:
    call ReadOneCharFromFile  ; -> AL
    cmp  al, 0
    je   SkipToNextNameInFile
    cmp  al, [si]
    jne  SkipToNextNameInFile
    inc  si
    cmp  byte [si], 13
    jne  More
    call ReadOneCharFromFile  ; -> AL
    cmp  al, 0
    jne  SkipToNextNameInFile
MatchFound:
    ...
SkipToNextNameInFile:
    ...
...