需要帮助理解MASM的条件指令

时间:2011-12-21 00:33:14

标签: assembly x86 masm

我正在尝试使用MASM指令在MASM中实现以下c代码:

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

我觉得我的逻辑是合理的,但无论我改变什么,保持它完整我都会收到错误。我确信我误解了一些事情,但不确定是什么。

1 个答案:

答案 0 :(得分: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

这至少对我来说很好。