挣扎于汇编语言

时间:2011-09-22 06:08:18

标签: loops assembly hex

我很难掌握汇编语言的概念。我得到了这个示例代码:

ploop:  mov  ax, 0201h
        add  al, ah
        cmp  al, 5
        jb   ploop
eloop:

循环结束时的十六进制值是0205,但我不确定我理解为什么。

对于第一行,我们将0201移动到ax,所以al = 01并且ah = 02.然后你向al添加ah,使al = 03.我们将al与5比较,因为3< 5,它适合jb并再次通过ploop。我们经历了所有步骤,并且在cmp al = 05 == 5,所以它不再适合jb。

这是看待它的正确方法吗?

2 个答案:

答案 0 :(得分:3)

几乎正确。除了你可能希望它看起来像以下代码:

        mov  ax, 0201h
ploop:  add  al, ah
        cmp  al, 5
        jb   ploop
eloop:

因为它将进入无限循环,因为alah在每次循环迭代中被覆盖。

答案 1 :(得分:2)

我几乎打赌你错误地转录了代码。就目前而言,你有一个无限循环。它需要更像这样:

        mov  ax, 0201h
ploop:  add  al, ah
        cmp  al, 5
        jb   ploop
eloop:

当您发布它时,ax将在循环的每次迭代开始时重新加载0201h。然后,您将ah中的02添加到al中的01。这将给出3.你将它与5进行比较,如果它小于(显然它总是会)你再次执行循环。

移动标签后,我们以<{1}}中的02和ah中的01开始。然而,在循环的每次迭代中,我们将02添加到al的当前内容,因此它将遵循序列1,3,5。在每次迭代时,我们将其内容与5进行比较,并继续循环,如果并且只有当它小于(被视为无符号)时,所以循环执行三次迭代,然后以al = 5停止。