运行时检查失败#0 - ESP的值未在函数调用中正确保存

时间:2012-04-11 08:46:14

标签: c++ assembly runtime

#include<stdio.h>
int a[100];
int main(){
    char UserName[100];
    char *n=UserName;
    char *q=NULL;
    char Serial[200];
    q=Serial;
    scanf("%s",UserName);
//this is about 
    __asm{
        pushad
            mov eax,q
            push eax
            mov eax,n
            push eax
            mov EAX,EAX
            mov EAX,EAX
            CALL G1
            LEA EDX,DWORD PTR SS:[ESP+10H]
        jmp End
G1:
        SUB ESP,400H
            XOR ECX,ECX
            PUSH EBX
            PUSH EBP
            MOV EBP,DWORD PTR SS:[ESP+40CH]
        PUSH ESI
            PUSH EDI
            MOV DL,BYTE PTR SS:[EBP]
        TEST DL,DL
            JE L048
            LEA EDI,DWORD PTR SS:[ESP+10H]
        MOV AL,DL
            MOV ESI,EBP
            SUB EDI,EBP
L014:
        MOV BL,AL
            ADD BL,CL
            XOR BL,AL
            SHL AL,1
            OR BL,AL
            MOV AL,BYTE PTR DS:[ESI+1]
        MOV BYTE PTR DS:[EDI+ESI],BL
            INC ECX
            INC ESI
            TEST AL,AL
            JNZ L014
            TEST DL,DL
            JE L048
            MOV EDI,DWORD PTR SS:[ESP+418H]
        LEA EBX,DWORD PTR SS:[ESP+10H]
        MOV ESI,EBP
            SUB EBX,EBP
L031:
        MOV AL,BYTE PTR DS:[ESI+EBX]
        PUSH EDI
            PUSH EAX
            CALL G2
            MOV AL,BYTE PTR DS:[ESI+1]
        ADD ESP,8
            ADD EDI,2
            INC ESI
            TEST AL,AL
            JNZ L031
            MOV BYTE PTR DS:[EDI],0
            POP EDI
            POP ESI
            POP EBP
            POP EBX
            ADD ESP,400H
            RETN
L048:
        MOV ECX,DWORD PTR SS:[ESP+418H]
        POP EDI
            POP ESI
            POP EBP
            MOV BYTE PTR DS:[ECX],0
            POP EBX
            ADD ESP,400H
            RETN


G2:
        MOVSX ECX,BYTE PTR SS:[ESP+4]
        MOV EAX,ECX
            AND ECX,0FH
            SAR EAX,4
            AND EAX,0FH
            CMP EAX,0AH
            JGE L009
            ADD AL,30H
            JMP L010
L009:
        ADD AL,42H
L010:
        MOV EDX,DWORD PTR SS:[ESP+8]
        CMP ECX,0AH
            MOV BYTE PTR DS:[EDX],AL
            JGE L017
            ADD CL,61H
            MOV BYTE PTR DS:[EDX+1],CL
            RETN
L017:
        ADD CL,45H

            MOV BYTE PTR DS:[EDX+1],CL
            RETN



End:
        mov eax,eax
        popad
    }

    printf("%s\n",Serial);

    return 0;
}
你能帮帮我吗? 关于Asm的这个问题,我不知道为什么导致这个结果。 这个程序非常简单,它关于内部代码程序。

运行时检查失败#0 - ESP的值未在函数调用中正确保存。这通常是调用使用一个调用约定声明的函数的结果,函数指针使用不同的调用约定声明。

2 个答案:

答案 0 :(得分:1)

似乎在调用G1之前被推入堆栈的两个参数永远不会从堆栈中弹出。

答案 1 :(得分:0)

可能会发生这种情况,因为在G1函数的开头SUB ESP,400HL031 ADD ESP,8之后,ADD ESP,400H结束ESPG18通话之前{{1}}看起来{{1}}比通过{{1}}后更少。

编辑:关于汇编功能的编码风格,请参阅this。这里简要描述了调用者的职责是什么,被调用者的责任是什么,被认为是ESP。