2014-03-13 72 views
2

我學習彙編語言的時刻,並通過逃學爾灣書彙編語言,他談到條件跳轉指令,並給出了下面的例子怎麼做與SUB操作條件跳轉指令工作

Example 2: 
mov bx,1234h 
sub bx,1234h 
jne L5 ; jump not taken 
je L1 ; jump is taken 

Example 3: 
mov cx,0FFFFh 
inc cx 
jcxz L2 ; jump is taken 

人請向我解釋例2中的「je L1」是如何工作的。你不需要在某處使用cmp命令。什麼特別讓你跳躍,因爲在那一刻bx = 0;

此外,爲什麼是例3中的跳躍。我認爲你正在增加cx,但是如果cx = 0,jcxz會測試嗎?

任何幫助將不勝感激。

回答

0

因爲從比較中設置的位標誌(在這種情況下,您只關心ZF)尚未被清除。

在旁註中,您應該使用CMP而不是SUB

0

「條件」基於標誌,通常是進位標誌,零標誌,負標誌和溢出標誌。但並非所有的處理器架構都採用完全相同的方式,但多數使用這四個標誌。

這些標誌來自「alu」,指令集定義了哪些標誌是否受每條指令的影響。因此,您必須查看每條指令的文檔,瞭解哪些標誌受到影響以及如何實施,然後瞭解是否可以幫助您。

減法或比較(差異通常是子修改結果寄存器或內存,其中cmp做的所有事情與減法相同,除非它不修改目標)非常有用,因爲使用單個減法可以確定等於,大於或小於(以及小於或等於,大於或等於)的組合。

對於案例je或跳躍,如果相等。如果您從b和b中減去a,並且a是相同的值,那麼結果爲零,則相減將導致爲零。如果結果爲零,則設置z標誌,否則不設置z標誌。因此,如果比較結果與z標誌被設置爲相等的情況相同,那麼如果相等則跳轉,如果跳轉爲0,則跳轉,如果結果爲零則跳轉,如果設置了零標誌,則跳轉與跳轉相同。如果不設置零標誌,則Jne跳轉(如果不相等或跳轉)(有時根據指令集和語法,您將看到jnz)。在你的情況下,你從自身減去1234結果爲零,z標誌被設置,jne不會影響它所說的跳轉,如果z位爲零或繼續前進,所以它繼續前進,然後je說跳轉,如果z標誌設置它是如此跳躍...

2

不,你不需要在任何地方使用cmp命令。許多指令會影響標誌(或其中的一個子集)。

sub是爲此目的而特別「好」,因爲它會影響在完全相同的方式標誌一個cmp沒有(subcmp之間的唯一區別是,sub寫減法到目的地的結果,而cmp纔不是)。

請記住,je實際上只是jz的同義詞,它並不關心任何形式的平等,它只是看着Z標誌。 1234h減去本身顯然是零,所以應該設置Z標誌。

在第二個示例中,jcxz的分支如果是cx = 0,則是這種情況。增加cx後,它將爲零,因爲它之前爲-1。