2
#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 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

4

2 回答 2

1

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

于 2012-04-11T08:52:56.070 回答
0

可能发生这种情况是因为在函数的开头,在G1SUB ESP,400H之后,在L031ADD ESP,8结束时ADD ESP,400H。似乎通话ESP前比G1通话8后少。

编辑:关于汇编函数的编码风格,请看这个。这里简要描述了调用者的职责和被调用者的职责,这些职责是 ESP 所考虑的。

于 2012-04-11T09:01:41.723 回答