x86汇编输出错误?

时间:2018-10-18 13:57:52

标签: assembly x86

我是汇编语言的新手,我无法弄清楚为什么它不能正常工作。它基于

abstract

组装零件看起来像

int main ( )  
{ 
    int a=2, b=1, c; 
    if (a < b)    
    {   
        c = a + 1;  
    }  
    else    
    {  
         c = a – b;   
    } 
}

当它跳到d时,它工作正常,但是当它跳到d时,它给出的答案是0而不是1。

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