我是新来的汇编语言,我可以弄清楚到底为什么这个不能正常工作。它是基于
int main ( )
{
int a=2, b=1, c;
if (a < b)
{
c = a + 1;
}
else
{
c = a – b;
}
}
而装配部分看起来像。
.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
jg d ;Makes program jump dow to d if a < b
add eax, 1 ;eax = a + 1
d:
sub eax, ecx ;eax = a - b
pop ebp
ret
CalcResult_ endp
end
当它跳到d的时候工作正常,但是当它不跳的时候,它只是给我0而不是1的答案。
另外,在我看来 JG
指令应改为 JGE
,所以,如果A < B不执行跳转,否则就执行.此外,在使用了 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