【问题标题】:Need help understanding conditional directives with MASM需要帮助理解 MASM 的条件指令
【发布时间】:2011-12-21 00:33:14
【问题描述】:

我正在尝试使用 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

我觉得我的逻辑是合理的,但无论我如何改变以保持其完整,我都会遇到错误。我确定我误解了一些东西,但不要不确定。

【问题讨论】:

    标签: assembly x86 masm


    【解决方案1】:

    首先,由于您只有一个开口.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
    

    这组装得很好,至少对我来说是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多