【问题标题】:Irvine Assembly (MASM ) - Sorting Through an Array / TableIrvine Assembly (MASM) - 对数组/表进行排序
【发布时间】:2014-04-21 00:04:38
【问题描述】:

我目前正在实施一个程序,该程序接受一个等级值的输入(例如 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”。该程序也暂时停止工作。

我相信它与指针和数据大小有关。我的理想目标是将字母等级的值存储在一个变量中,但鉴于使用指针所需的数据大小,我似乎无法找到一种方法。关于如何做到这一点的任何想法?

【问题讨论】:

    标签: arrays assembly masm irvine32


    【解决方案1】:

    您正在调用WriteString,但表中的值是字符而不是字符串。这种情况下的不同之处在于它们不是零终止的。如果有的话,要么使用WriteChar,要么在你的表中输入一个零,但不要忘记调整NumCols。

    还请注意,CMPSB 会增加两个指针,这意味着您的比较将是错误的。您可能应该只使用非字符串CMP,尤其是因为user_ip 已经在寄存器AL 中。

    PS:终于有人用桌子了:)

    【讨论】:

    • 太棒了!工作完美。谢谢!很高兴你也使用表格!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多