x86汇编语言输出错误?

问题描述 投票:0回答:1

我是新来的汇编语言,我可以弄清楚到底为什么这个不能正常工作。它是基于

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的答案。

assembly x86
1个回答
0
投票

另外,在我看来 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
© www.soinside.com 2019 - 2024. All rights reserved.