我目前正在实现一个程序,该程序输入一个等级值(例如75),然后输出对应的字母等级。我已经通过数组/表实现了以下要求的等级:
.data
table BYTE 89d, 'A'
BYTE 79d, 'B'
BYTE 69d, 'C'
BYTE 59d, 'D'
BYTE 0d, 'F'
NumCols = 2
NumRows = 5
user_ip BYTE ?
message1 BYTE "Enter a grade value: ", 0h
message2 BYTE "The Grade of ", 0h
message3 BYTE " Yields A Letter Grade of ", 0h
我使用以下代码对这个数组/表进行排序,并输出字母等级。
mov edx, OFFSET message1
call WriteString
call readDec
mov user_ip, al
mov esi, OFFSET user_ip
mov edi, OFFSET table
mov ecx, NumRows
L1:
CMPSB
jae L2
add edi, NumCols
Loop L1
L2:
mov edx, OFFSET message2
call WriteString
mov al, user_ip
call WriteDec
mov edx, OFFSET message3
call WriteString
mov edx, edi
call WriteString
call Crlf
有了75的输入,我得到了:"75的等级产生了EC的字母等级;D"。程序也暂时停止工作。
我相信这与指针和数据大小有关。我的理想目标是将字母等级的值存储在一个变量中,但考虑到使用指针所需的数据大小,我似乎找不到实现这一点的方法。有什么办法吗?
您正在调用WriteString
,但表中的值是字符而不是字符串。这种情况下的区别在于,它们不是零终止的。如果有,可以使用WriteChar
,或者在表中加一个零,但也不要忘记调整NumCols
。
还要注意,CMPSB
会增加两个指针,这意味着您的比较将是错误的。您可能只应该使用非字符串CMP
,特别是因为user_ip
已经在寄存器AL
中。
PS:最后一个使用表格的人:)