2014-09-12 74 views
-1

我有幾個例子,除了LABEL概念外,都非常簡單。 示例1本身增加25 10次,而示例2取補充寄存器A 700次。彙編語言中的「標籤」

Example-1: MOV A,#0 
       MOV R2,#10 
AGAIN:  ADD A,#25 
       DJNZ R2,AGAIN 
       MOV R5,A 

Example-2: 
       MOV A,#55H 
       MOV R3,#10 
NEXT:   MOV R2,#70 
AGAIN:  CPL A 
       DJNZ R2,AGAIN 
       DJNZ R3,NEXT 

我無法理解LABEL的概念。在示例1中,當第一次運行程序時,A的值爲25,然後當R2從10遞減到1時,輸出爲275而不是250.但是如果我假設LABEL被繞過,除非它被調用,那麼事情就可以了我得到的結果是250.但是如果我在例2中假設同樣的事情(繞過LABEL逐步執行),那麼LABEL NEXT將被繞過。並且「DJNZ R2,AGAIN」將被執行。由於NEXT被繞過,R2將如何獲得#70的價值?所以我的問題是關於LABEL的執行。標籤是被執行還是被繞過?

+1

「LABEL」是一種東西,所以你不必手動計算出跳轉到的地址。它不是*指令並且不佔用空間(除了彙編程序可能使代碼對齊以使其有效)。 – user2864740 2014-09-12 10:04:20

+0

一個標籤不是你繞過或不是 - 它只是下面的指令所在的地址的符號名稱。您可以在每條線的前面添加一個標籤,而不會產生任何影響 - 除非您實際使用它來跳轉或調用它。 – 2014-09-12 10:05:23

+0

對。然後在Example-1中,當第一次程序運行時,Add命令給A加25,而當10次DJNZ在A中加25時它應該是275.但是在例子中答案是250。那是怎麼回事? – 2014-09-12 10:10:52

回答

0

,並在10倍DJNZ在A將25應該出來是275

號,250是正確答案。 第10加法指令後,註冊R2仍含有1 - 那麼它就會被減爲0,然後指令DJNZ 跳轉到標籤了,但跳到下面的指令。

。你可以把DJNZ爲兩個指令,類似於

DEC R2 
JNZ AGAIN ; NOTE: 8051 does not have a Zero flag - would need to 
       ; use ACC for that, so treat this as pseudo code! 

您可以使用模擬器像http://www.edsim51.com/到瀏覽說明,看寄存器每一步如何變化。這對於瞭解具體指令的具體行爲非常有用。

0

標籤沒有被繞過...如果你看看循環的工作,那麼你會看到第一個DJNZ遞減寄存器的值,如果結果是非零,它會執行標籤。在第一個例子中,從上面開始: 1)A得到零,然後 2)R2得到10,然後 3)A獲得25,然後 4)DJNZ遞減R2的值使其成爲9並且因爲結果非零,執行AGAIN並在A中增加25,使其等於50,等等......當R2的值達到1時,DJNZ遞減它並且結果爲零,因此它不會再執行。因此,DJNZ執行9次,結果25 * 9 = 225。但是,在執行循環DJNZ之前,25存儲在A中,結果爲250 .. 希望它可以幫助你..

+0

請編輯您的答案並修改換行符(您可以使用
標籤)。 – 2015-06-07 14:01:32