我是汇编语言的新手,我无法弄清楚为什么它不能正常工作。它基于
abstract
组装零件看起来像
int main ( )
{
int a=2, b=1, c;
if (a < b)
{
c = a + 1;
}
else
{
c = a – b;
}
}
当它跳到d时,它工作正常,但是当它跳到d时,它给出的答案是0而不是1。
答案 0 :(得分:0)
在我看来,JG
指令也应替换为JGE
,这样,如果A Add EAX, 1指令(最好用Inc EAX
代替)之后,必须遵循无条件跳转,该跳转在Sub EAX, ECX
指令之后立即进行:
.model flat,c
.code
CalcResult_ proc
push ebp
mov ebp,esp
;see if a<b
mov eax,[ebp+8] ;eax = a
mov ecx,[ebp+12] ;ecx = b
cmp eax,ecx
jge d ;Makes program jump down to d if a >= b
inc eax ;eax = a + 1
jmp e
d:
sub eax, ecx ;eax = a - b
e:
pop ebp
ret
CalcResult_ endp
end
实际上使用CMovL指令,代码更简单 (少一条指令):
.model flat,c
.code
CalcResult_ proc
push ebp
mov ebp,esp
;see if a<b
mov eax,[ebp+8] ;eax = a
mov ecx,[ebp+12] ;ecx = b
mov edx,-1 ;edx = -1
cmp eax,ecx ;compare A to B
cmovl ecx,edx ;if A < B set B to -1
sub eax,ecx ;A = A - B
pop ebp
ret
CalcResult_ endp
end