[英]x86 Assembly output wrong?
我是汇编语言的新手,我无法弄清楚为什么这不能正常工作。 它基于
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.