2016-01-20 176 views
2

我知道這裏和其他地方的許多帖子都是爲了避免高級編程語言中的goto。然而,從我在MIPS彙編中編寫的(確實很小的)經驗來看,在實現控制流程時,似乎沒有一種明顯的方法可以避免彙編中的彙編語句和跳轉語句。如何避免彙編代碼時跳轉和跳轉?

例如如何將這個代碼用匯編語言實現的(C當量):

if (x < 2) 
    { ans = 0; } 
else 
    { ans = 1; } 

會使用goto語句或跳轉語句是必要的,或者是有避免他們贊成的正確方法更適當的代碼實踐?

+1

有時您可以使用無分支技術。你的例子很簡單,沒有分支就可以做得更好:從edx:'xor eax,eax' /'cmp edx,2' /'setnl al'中的'x'開始。 'ans'現在住在'eax'中。 –

+0

全尺寸arm 32位指令對每條指令都有條件執行,所以對於您的代碼,您可以進行比較,然後如果小於0,則mov爲mov,如果大於或等於1,則爲mov並且不跳轉。除此之外,像gotos這樣的指令集經常需要並且經常發生,這就是爲什麼高級語言不鼓勵它的原因。那就是處理器如何工作,爲什麼不用語言反映呢? –

回答

7

避免在高級編程語言中使用goto的建議僅適用於高級語言。

彙編是一種低級語言,跳轉是必不可少的。

2

你不能完全避免使用跳轉指令,因爲你已經幾乎和處理器直接交談了。

但是,如果您使用的是更高級的編程,那麼您仍然可以在彙編代碼中使用較少的跳轉。

一些想法,如:

  • 跳轉內塊,而不是塊之間。
  • 按照傳統的for/while/if/case序列跳轉到一個簡單易讀的邏輯。
  • 一個組件塊做一件事;最小的副作用。
  • 嘗試使用宏或函數,不要重複自己。
+2

如果你爲了可讀性/可維護性的原因而發現自己使用了更多/更差的跳轉,你應該切換到C,並讓編譯器做得更好(除非你正在編寫一個小引導程序或最自然的用asm編寫的東西)。但我同意一般情況下的「跳入塊之間,而不是」之間的建議。 –

0

雖然它不是MIPS,但對於X86處理器,在Microsoft彙編程序ML.EXE(16/32位)和ML64.EXE(64位)的情況下,由於MASM 6.11和所有版本的Visual Studio,你可以使用點指令:

 .if  x < 2 
     mov  ans,0 
     .else 
     mov  ans,1 
     .endif 

在這個例子中,點指令轉化爲比較立即數和立即移動。欲瞭解更多信息,請參閱

http://msdn.microsoft.com/en-us/library/8t163bt0.aspx

+0

這只是分支指令上的語法糖,但我想它確實可以防止asm變成意大利麪代碼。就像我之前評論的那樣,如果你正在做很多這樣的事情,而不是仔細思考如何使用更少的分支和更緊密的代碼,你應該只使用編譯器。 –