为什么在MASM Assembly中减少WORD类型计数器时会得到一个奇怪的值?

时间:2016-05-27 13:20:39

标签: loops assembly masm32

我正在使用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循环,也会发生同样的情况。

1 个答案:

答案 0 :(得分:2)

mov ecx,0
.WHILE icount >= ecx

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

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

  

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

     
      
  • 这些指令生成适当的处理器指令。它们不是新的指示。
  •   
  • 他们需要正确使用有符号和无符号数据声明。
  •   
     

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

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