我正在尝试使用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
我觉得我的逻辑是合理的,但无论我改变什么,保持它完整我都会收到错误。我确信我误解了一些事情,但不确定是什么。
答案 0 :(得分: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
这至少对我来说很好。