【问题标题】:Store a multi-byte character constant into a MASM byte array?将多字节字符常量存储到 MASM 字节数组中?
【发布时间】:2019-11-10 23:12:45
【问题描述】:

我正在尝试编写一个简单的程序,该程序将根据用户输入的等级将字母等级分配给字符串变量,该等级存储在名为“AGrade”的变量中。我写了这样的陈述:

     LGrade proc AGrade;dword ; 1 Parameter 
    .if (AGrade > -1) && (AGrade<60)
    mov letter, "F"
    .EndIf

     .if (AGrade > 66) && (AGrade<70) 
    mov letter, "D+" ;ERROR SHOWS HERE
    .Endif

letter 被声明为letter byte " ", NULL

我得到错误:

 error A2070: invalid instruction operands

我注意到,当我完全删除第二个 if 语句时,我可以毫无问题地构建。所以我的猜测是我嵌套不正确。是否需要“其他”?如果可能的话,有人可以告诉我嵌套这两个语句的正确方法吗?非常感谢!

【问题讨论】:

  • @zx485 感谢您的回复!您是说“AGrade”变量与“字母”冲突吗?对不起,我对此很陌生。我认为在每个之间有“.endif”可以解决这个问题
  • .if与你的错误无关,看它在哪一行。 (并尝试通过删除其他行来制作更小的minimal reproducible example)。 "D+" 不是一个字母;大概letter 是一个db 变量或数组,而"D+" 有多个字符。 MASM 对多字符常量很奇怪;避免它。
  • 你好@PeterCordes,我已经将“字母”初始化为“字母字节”,NULL“
  • @PeterCordes 谢谢!!!!如果我将“字母”初始化为单词而不是字节,它会按照我的方式工作吗?
  • 是的,我认为"D+"word 大小,但我不知道。不过,它的顺序是错误的。

标签: assembly procedure masm irvine32 masm32


【解决方案1】:

.if与你的错误无关,看它在哪一行。

"D+" 不是单个字节,但您的 letter 是一个 byte 数组,MASM 神奇地将其与字节操作数大小相关联。

您可能需要mov word ptr letter, "+D" 来匹配您的 2 字节存储的操作数大小。

请参阅When using the MOV mnemonic to load/copy a string to a memory register in MASM, are the characters stored in reverse order? MASM 对多字符常量很奇怪,因此您需要在源代码中反转它们与您希望存储到内存中的顺序。 (与 NASM 等优秀的汇编器不同,MASM 在将它们放入直接常量时会从源中反转字节。)

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多