是否有使用emu8086 CMP两个字符串的方法?

问题描述 投票:1回答:1

我正在一个项目中,使用汇编语言组织学生参加3项考试的评分。

我希望emu通过文本文件中的CMP来对用户的字符串进行CMP,因此,如果ZF设置为1,则emu将打印来自同情。

这里是代码,我从你们那里得到帮助。

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
string assembly readfile openfire emu8086
1个回答
0
投票

请在继续操作之前更正这些错误:

  • LNBF DB 1EH,?在设置缓冲区以输入学生姓名方面做得不好!它会覆盖MSG1,而不提供适当的专用缓冲区。正确的方法是:LNBF DB 30, 0, 30 dup (0)有关DOS.BufferedInput函数0Ah的详细信息,请参见How buffered input works

  • 您的从文件读取代码忘记指定所需的功能编号3Fh。使用mov ah, 3Fh。同样,您也不应该忽略通过进位标志返回错误的可能性!


下面是您可以使用的示例。它将输入缓冲区中以carriage return终止的名称与文本文件中以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:
    ...
© www.soinside.com 2019 - 2024. All rights reserved.