Нужна помощь в понимании условных директив с MASM - PullRequest
0 голосов
/ 21 декабря 2011

Я пытаюсь реализовать следующий код c в MASM, используя директивы 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

Я чувствую, что моя логика здравая, но независимо от того, что я изменяю, чтобы сохранить ее нетронутой, я получаю ошибки. Я уверен, что что-то неправильно понял, но не знаю, что именно.

1 Ответ

0 голосов
/ 09 января 2012

Прежде всего, поскольку у вас есть только одно отверстие .if, вам нужен только один .endif. Во-вторых, по крайней мере, если a, b, c1 и d являются нормальными операндами памяти, у вас есть проблема, заключающаяся в том, что большинство инструкций не может использовать два операнда памяти (напрямую). Для типичных сравнений, по крайней мере, один из операндов больше всего будет в регистре.

Кроме того, я бы также выделил код .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

Это прекрасно собирается, по крайней мере для меня.

...