2016-09-30 78 views
-2

我怎麼在裝配使用循環翻譯此C#代碼和/或跳躍彙編語言循環

 int sum = 0; 
     int count = 15; 

     while (count != 0) 
     { 
      if (count % 2 != 0) 
       sum = sum + count; 
      count--; 
     } 

     Console.WriteLine(sum); 
+3

最好的地方是研究指定的期望平臺的指令集,然後使用適當的彙編程序來生成代碼。 –

+0

我有點想知道這是什麼令你困惑,因爲這可以幾乎1:1轉換爲x86 ASM指令(我假設x86,因爲你沒有指定目標CPU),所以它只是缺乏信心嘗試去做,或者甚至根本沒有看到指令集(試着先找到80286或80386,它包含了所有的基本指令,不需要學習整個現代x86集合以及所有擴展的東西,比如SSE或開始時的浮點數)。你會嘗試至少一些東西,並描述你做了什麼,它可能會更容易看到問題在哪裏,以及建議什麼...... – Ped7g

+0

對此問題的另一種答案是:將其寫爲有效的C++(只是刪除控制檯)並用「彙編」開關進行編譯。 C/C++編譯器在生產彙編方面非常出色。 – Ped7g

回答

0

一個「而」通常是

L_repeat: 
    compare while_condition 
    jumpIfFalse L_exit 

    ... loop body ... 

    jump L_repeat 
L_exit: 

也是一個如果,你有反轉條件:

compare if_condition 
jumpIfFalse L_skip 

... inside if 

L_skip: 

,那麼你需要寄存器,一個牽你的計數,一個總和,像這樣的東西出來:

mov Rsum,0 
mov Rcount,15 

L_repeat: 
    cmp Rcount,0 
    jz L_exit   ; jump if not (Rcount != 0) gets jump if Rcount==0 
     mov Rtemp, Rcount 
     and Rtemp, 1 
     jz L_skip 
     add Rsum, Rcount 
    L_skip: 
     dec Rcount 
     jmp L_repeat 
l_exit: