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