2013-04-14 51 views
-3

是否可以在x86彙編語言中創建嵌套循環?我想將這個psedocode轉換成正確的x86彙編代碼(使用MASM語法),但我不知道如何初始化每個循環計數器。甚至有可能在x86程序集中聲明局部變量(與其他大多數編程語言一樣)?如何在x86彙編語言中創建嵌套循環

for (var i = 0; i < 10; i++){ 
    for(var j = 0; j < 10; j++){ 
     for(var k = 0; k < 10; k++){ 
      mov eax, i + j + k; 
     } 
    } 
} 
+0

這個問題有一個看似相似的標題,但它主要是不相關的:http://stackoverflow.com/questions/15398672/nested-loop-in-x86-assembly?rq=1 –

+0

此外,這個問題可能是相關的(即使它沒有明顯的原因得到大量的downvotes):http://stackoverflow.com/questions/10890648/how-to-set-local-variable-assembly-x86 –

+5

鑑於你的C代碼最終被翻譯成機器代碼,這兩個問題的答案是肯定的,不需要問。 –

回答

12

當然,這是可能的。由於每個計算機程序最終歸結爲彙編 - 它自然是最強大的語言(不包括直接位操作)。

的實際代碼取決於你的系統,編譯器和應用的優化,但基本上應該是這樣的(例如2個嵌套循環,而不是3):

  mov ecx, 0 

outerLoop: 

      cmp ecx, 10 
      je done 
      mov ebx, 0 

innerLoop: 
      mov eax, ecx  ; do your thing here 
      add eax, ebx 

      cmp ebx, 10 
      je innerLoopDone 
      inc ebx 
      jmp innerLoop 

innerLoopDone: 

      inc ecx 
      jmp outerLoop 
done: 

注意,你不需要局部變量,你有通用的寄存器用於你需要的用途。如果你堅持有變量,你可以使用它的內存地址和使用寄存器指針進行讀/寫操作。

+0

我會在內循環之前推CX,然後彈出它。 –

+2

@MartinJames有很多種方法可以做到這一點。特別是push/pop會比較慢,如果這是個問題 – SomeWittyUsername

+0

這些循環可以工作,但它們看起來像未優化的編譯器輸出(C結構的直接音譯)。這對於asm來說不是慣用的,你通常在底部有'jcc',並且根本沒有'jmp'。所以,你需要退出循環。不過,它很好地顯示了使用單獨的寄存器來存儲單獨的循環計數器。 (關於Martin的觀點:push/pop CX和使用緩慢的'loop'指令是一個16位習慣用法,它不再有用或不相關。)總的來說,值得讚揚,特別是最後一段。 –