2011-12-21 124 views
0

我試圖用MASM指令來實現MASM下面的C代碼的條件指令:需要幫助理解與MASM

if (a > b) 
    a = a - 1; 
else 
    if (b >= c) 
     b = b − 2; 
    else 
     if (c > d) 
      c = c + d; 
     else 
      d = d/2; 

這是我的嘗試:

.if (a > b) 
sub a, 1 
.elseif b >= c1 
sub b, 2 
.elseif c1 > d 
add c1, d 
.else 
mov eax, d 
cdq 
mov ebx, 2 
idiv ebx 
mov d, eax 
.endif 
.endif 

我覺得我的邏輯是聲音,但無論我改變周圍,以保持完好我收到錯誤。我確信我誤解了一些東西,但不確定是什麼。

回答

0

首先,因爲你只有一個開口.if,你只需要一個.endif。其次,至少如果abc1d是正常的存儲器操作數,你有大部分指令不能使用兩個內存操作數(直接)的問題。對於典型的比較,至少有一個操作數最多在寄存器中。

順便說一句,我也縮進.if(並且這樣的)代碼,就像你通常會在一個更高層次的語言代碼。至少有通常情況下,我還用dec代替sub x, 1,並且可能shr代替idiv由2

把所有的分以上考慮,你最終是這樣的:

.model flat, c 
.data 
    a dd ? 
    b dd ? 
    c1 dd ? 
    d dd ? 

.code 
junk proc 
    mov eax, a 
    mov ebx, b 
    mov ecx, c1 
    mov edx, d 

    .if eax > ebx 
     dec a 
    .elseif ebx >= ecx 
     sub b, 2 
    .elseif ecx > edx 
     add ecx, edx 
     mov c1, ecx 
    .else 
     shr edx, 1 
     mov d, edx 
    .endif 
junk endp 

    end 

這種組裝就好了,至少對我來說。