我正在一个项目中,使用汇编语言组织学生参加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
请在继续操作之前更正这些错误:
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:
...