我正在使用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循环,也会发生同样的情况。
答案 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条件将不再为真,因此退出循环。