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

への呼び出しの前にスタックにプッシュされる 2 つのパラメーターは、スタックG1から決してポップされないようです。

于 2012-04-11T08:52:56.070 に答える
0

おそらく、関数の最初にG1you 、 makeSUB ESP,400Hの後、最後に youが発生する可能性があります。通話前は通話後よりも少ないようです。L031ADD ESP,8ADD ESP,400HESPG18

編集:アセンブリ関数のコーディング スタイルについては、こちらを参照してください。ここでは、ESP と見なされる呼び出し元の責任と呼び出し先の責任について簡単に説明します。

于 2012-04-11T09:01:41.723 に答える