繁体   English   中英

x86 汇编输出错误?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM