Irvine Assembly(MASM)-通过数组/表格进行排序



我目前正在实现一个程序,该程序输入一个等级值(例如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:最后一个使用表格的人:)

最新更新