2011-09-22 116 views
1

我很难理解汇编语言的概念。我给出了这个示例代码:与汇编语言拼搏

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

循环结尾处的十六进制值是0205,但我不确定我是否理解了原因。

对于第一行,我们将0201转换为ax,所以al = 01和ah = 02。然后你给a​​l加上ah,使得al = 03。我们将al与5进行比较,因为它适合于3,< 5 jb再次通过ploop。我们经历了所有的步骤,并在cmp al = 05 == 5,所以它不再适合jb。

这是看它的正确方法吗?

回答

3

几乎正确。除非你可能希望它看起来像,而不是执行以下操作:

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

因为它,否则将进入一个无限循环的alah在每次循环迭代被覆盖。

+0

哎呀!输入错误。谢谢! – raphnguyen

2

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

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

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

随着标签感动,我们有02 ah和01 al开始。但是,在循环的每次迭代中,我们将02添加到al的当前内容中,因此它将遵循序列1,3,5。在每次迭代时,我们将其内容与5进行比较,并且继续循环,当且仅当它是小于(视为无符号),因此循环执行三次迭代,然后停止,并且al = 5.