2011-12-21 120 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 

这种组装就好了,至少对我来说。