0

プログラムで、ASM コードのセクションを終了して C++ コードに戻ると、project00.exe の 0x93b3237d で未処理の例外が発生します: 0xC0000005: アクセス違反。Crtexe.c の行 mainret = main(argc, argv, envp); で 0CがESPに追加されたときの逆アセンブリ。問題は、戻る前にメイン関数の戻りアドレスが破損し、失敗する可能性があると思います。プログラムは、2 つの集合の交点と和集合を見つけます。VS10を使用していて、アイデアがありません。


    include "iostream.h"//modify line to show up in code block

    using namespace std;

    typedef int DWORD;      //4 btye double word
    typedef char BYTE;      //1 byte 
    typedef short WORD;     //2 byte double word

    int main(){ 

    int i =0;
    BYTE str0[50] = "1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik,9ol.0p;/-[?]F!Q"; 
    BYTE str1[50] ="QAZ@WSX#EDC$RFV%TGB^YHN&UJM*IK)P:?_{?}|1`"; 
    DWORD length0 ; 
    DWORD length1 ;
    BYTE IntersectArray[50]; 
    BYTE result [100] ;

    __asm{
    p:
    pusha
    lea eax, str0
    call COUNT 
    mov length0,ecx
    lea eax, str1
    call COUNT 
    mov length1,ecx
    call INTERSECTION
    call JoinSet
    xor eax,eax
    popa
    ret




    COUNT: 
    mov ecx,0;
    Q: mov dl, [eax]
    cmp dl,0h
    JE cEND
    inc eax
    inc ecx
    jmp Q
    cEnd: ret


    INTERSECTION:
        lea edx, str0
        mov ebx, length0
        lea esi, IntersectArray
        first: mov al, [edx]
        mov ecx, length1
        lea edi, str1
        repne SCASB
        cmp ecx,0
        JNZ INTER
    Back:   inc edx
        cmp ebx,0
        JZ EXITSTUFF
        dec ebx
        jmp first

    INTER: mov [esi] , al
       inc esi
       jmp Back

    EXITSTUFF:
        mov [esi], 0
        ret

    JoinSet :
        lea edi, result
        lea esi, str0
        mov ecx, length0
        REP MOVSB   



            lea edx, str1
        mov ebx, length1
        lea esi, result + [ebx]
        f: mov al, [edx]
        mov ecx, length0
        lea edi, str0
        repne SCASB
        cmp ecx,0
        JNZ B
         mov [esi] , al
           inc esi
    B:      inc edx
        cmp ebx,0
        JZ EXITSTU
        dec ebx
        jmp f

    EXITSTU:
        mov [esi], 0
        ret
    }

休み

    for(int i =0;i < 50;i++){
cout <<IntersectArray[i];}
cout << endl;
for (int i =0; i<100;i++)
cout <<result[i];
cout << endl;
system("pause");
return 0;
}

4

1 に答える 1

2

x86 アセンブリを行ったことがないので、おそらくばかげたコメントです。しかし、私はasmがインラインだと思ったのですか?では、最初の 'ret' は実際に何から戻ってきたのでしょうか?

于 2012-04-18T10:00:35.923 に答える