2011-12-21 2 views
0

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

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

ответ

0

Прежде всего, поскольку у вас есть только одно отверстие .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 

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

Смежные вопросы