【问题标题】:Why do I get a strange value when decreasing a WORD type counter in MASM Assembly?为什么在 MASM 程序集中减少 WORD 类型计数器时会得到一个奇怪的值?
【发布时间】:2016-05-27 13:20:38
【问题描述】:

我正在使用 Kip Irvine 库编写 MASM Assembly 中的一些代码。我有一些这样的代码:

mov eax, n_var
mov icount, eax
mov ecx,0

.WHILE icount >= ecx

mov esi, icount
fld vector_sol[esi * 8]

dec icount
.ENDW

问题是,当 icount 为 0 时,在下一个循环中 icount 应该为 -1,但它得到的值是 4294967295。如果我尝试使用寄存器而不是 icount 循环,也会发生同样的情况。

【问题讨论】:

  • 如果打印为未签名的,这是正常的。使用签名输出​​。不过,您没有展示您的打印方式。
  • 也不知道>= 运算符使用什么。您应该避免使用这些辅助工具(例如.WHILE),尤其是如果您是初学者。只需编写纯 asm 代码。
  • 确实,-1 编码为FFFFFFFFh4294967295 也编码为FFFFFFFFh。区别在于它们的上下文

标签: loops assembly masm32


【解决方案1】:
mov ecx,0
.WHILE icount >= ecx

在无符号上下文中,这将始终为真(每个值都大于或等于零),因此结果是无限循环。

在使用 .WHILE.ENDW 指令之前,您应该了解它们的操作方式。从 MASM 手册中我们了解到:

这些结构的工作方式与在高级语言(如 C 或 帕斯卡。请记住以下几点:

  • 这些指令生成适当的处理器指令。它们不是新指令。
  • 它们需要正确使用已签名和未签名的数据声明。

这些指令会根据对某些条件的评估来执行一组指令。此条件可以是计算结果为 signedunsigned 值的表达式、使用 C 中的二元运算符(&&、|| 或 !)的表达式或状态的一面旗帜。有关表达式运算符的更多信息,请参见第 178 页。
条件的评估要求汇编器知道操作数是否 在条件是签名或未签名。明确声明一个命名内存 location 包含有符号整数,使用有符号数据分配指令 SBYTE、SWORD 和 SDWORD。

所以简而言之,您的 icount 变量应该被声明为 SDWORD,因为当dec icount 将值降低到 -1 时,while 条件将不再为真,从而退出循环.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多