For loop 我应该更改什么以退出循环?

For loop 我应该更改什么以退出循环?,for-loop,assembly,x86,For Loop,Assembly,X86,我想我应该改变这一行: inc byte [nr] 退出循环,我的程序应该打印512 %include "io.inc" section .data nr: db 0x88, 0x1 section .text global CMAIN CMAIN: for: inc byte [nr] jnc for inc byte [nr + 1] PRINT_UDEC 2, nr xor eax, eax ret

我想我应该改变这一行:

inc byte [nr]
退出循环,我的程序应该打印512

%include "io.inc"
section .data
  nr: db 0x88, 0x1
section .text
  global CMAIN
  CMAIN: 
    for:
      inc byte [nr]
    jnc for
      inc byte [nr + 1]
      PRINT_UDEC 2, nr 
      xor eax, eax
    ret

nr
接近255字节限制时,
INC
将超过该限制,并从255概括为0

不幸的是,没有在环绕上设置
进位
标志,这导致了无限循环,因为
JNC
的条件总是满足的

因此,一个解决方案就是改变

inc byte [nr]


它修改了携带标志。那么整个算法应该会如预期的那样成功。

您没有指定可以更改的内容。因此,在这种情况下:

%include "io.inc"
section .text
  global CMAIN
  CMAIN:
    mov   eax,512
    PRINT_UDEC 4,eax 
    ret   ; and not caring to return 0

如果查看该指令的指令集引用,您将看到INC不会更改进位标志。指令集引用表示CF标志不受影响。根据结果设置OF、SF、ZF、AF和PF标志。正因为如此,您的循环永远不会结束,因为您正在使用JNC(跳转-不进位)。也许您想要JNZ(跳转而不是零)而不是JNC?如果您想要增加1并设置进位标志,您可以使用指令,如
addbyte[nr],1
Side note。使用INC时,此代码有两种可能的结果之一。如果循环开始前进位标志已清除,则它将无限循环(这很可能是您看到的),如果恰好在循环之前设置,则它将打印649(0x200+0x89)。INC不会更改进位标志(您可以在OPs问题下看到我的注释)@迈克尔:是的。我在写那个答案时怀疑是这样,但没有检查。我要修正我的答案。你的答案仍然不一致,因为你先告诉OP这会一直持续到nr为0FFh=255。然后INC将超过255的8位限制,并设置?进位标志,因为255到0的环绕将导致这种情况。@MichaelPetch:很抱歉延迟,我的internet连接中断了一段时间。谢谢你纠正我有缺陷的答案。我仍然更喜欢
jnc
->
jnz
更改为“解决方案”:)因为
add
将编译为+1B更长的机器代码,所以你不能用
add
来“修复”该代码。我想至少他们可能是在寻找给定标记的循环。@MichaelPetch当然。。但是正确地表达你的问题是很重要的,这段代码也会退出(不存在的)循环。QEDSure。但在评论之前,我已经调查了问题的来源。如果你回顾一下这个,看看[2p]2。您将看到意图是什么。其思想是在不更改操作数的情况下,通过更改一行来修复循环,使其不再是无限循环,并因此打印512。使用类似JNZ的东西就可以了。我同意这个问题可以写得更好。@MichaelPetch“通过改变一行”是的。我在评论中看到了你的代码> JNZ 回答,我当然喜欢它,并认为它是正确的解决方案。这只是对OP的一种嘲弄(尽管我更喜欢“扩展视野”这个词),因为他没有在问题中提供重要信息,所以你必须调查被问到的问题,而不仅仅是答案。我几乎调查所有闻起来像是教程或作业的问题。大多数人在这里问问题时,往往会忽略为什么,也往往会忽略所教内容或要求的细节。
%include "io.inc"
section .text
  global CMAIN
  CMAIN:
    mov   eax,512
    PRINT_UDEC 4,eax 
    ret   ; and not caring to return 0