0

如何比较两个char,第一个是用户输入。

include 'emu8086.inc'

#make_COM#

ORG 100h

answer DW ?
score DW ?

MOV score, 0

PRINT "This is a 10 question Exam"

PUTC 13
PUTC 10
PUTC 13
PUTC 10

PRINT "1.) A is the Answer"
PUTC 13
PUTC 10
PRINT " A.)"
PUTC 13
PUTC 10
PRINT " B.)"
PUTC 13
PUTC 10
PRINT " C.)"
PUTC 13
PUTC 10
PRINT " D.)"
PUTC 13
PUTC 10
PRINT "Your Answer: "  
LEA     DI, buffer      
MOV     DX, 10     
CALL GET_STRING  
MOV answer, AX
PUTC 13
PUTC 10

MOV     SI, answer
CALL    print_string

CMP SI, answer
JE Correct
JMP result

Correct:
ADD score, 1
JMP result

result: 
PRINT "Your Score: "
CALL PRINT_NUM

RET

buffer DB "x"

DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
DEFINE_PRINT_STRING
DEFINE_GET_STRING

END
4

1 回答 1

1
buffer DB "x"

这不会给你足够的缓冲空间!如果您坚持您的定义,mov dx, 10那么您需要将其更改为:buffer db "1234567890". 因为正如我将解释的那样,2 个字节就足够了,这可以变成buffer db "12"

LEA     DI, buffer
MOV     DX, 10
CALL GET_STRING
MOV answer, AX

您似乎不知道GET_STRING过程是如何工作的!它将您的输入以零结尾存储在 DS:DI 的 DX 字节缓冲区中。由于您的答案将是单个字符,因此您需要定义 DX=2 并且您可以通过mov ax, [di] mov answer, ax. 此后 的答案是一个以零结尾的字符串,其内容具有单个字符。

MOV     SI, answer
CALL    print_string

在这里,您在 SI 中移动了answer的内容。您需要将零结尾字符串的地址传递给PRINT_STRING过程,因此请编写:lea si, answer call PRINT_STRING

CMP SI, answer
JE Correct
JMP result

由于您设置SI此比较的方式将始终返回Correct。您必须将内容与定义的值进行比较:(mov al, [si] cmp al, "A"提示:您写了“A 是答案”)

于 2016-02-03T11:31:49.693 回答