0

Visual Studio 2010プロジェクトでASMファイルを実行すると、asm関数が呼び出された後にクラッシュします

asmコードの使用:-

.386           
.model flat, c 
TEXT        SEGMENT
ALIGN       4  
L_add PROC

   push     ebp                   
   mov      ebp, esp

   mov      edx, dword ptr[ebp + 12]
   mov      eax, dword ptr[ebp + 8]
   add      edx, eax

   mov      esp, ebp  
   pop      ebp                                      
   ret      0                
   L_add ENDP
   TEXT     ENDS
   END**

上記のコードはVisualStudio2010では機能しません。セグメントTEXT SEGMENTとして変更すると正常に機能しますが、上記のコードと .codeの違いはVisualStudio2005で機能します。.codeTEXT SEGMENT

disaasembly at calling place:
b = hs_L_shl(L_var1,var2);
012D1484  movsx       eax,word ptr [var2]  
012D1488  push        eax  
012D1489  mov         ecx,dword ptr [L_var1]  
012D148C  push        ecx  
012D148D  call        @ILT+455(_hs_L_shl) (12D11CCh)  
012D1492  add         esp,8  
012D1495  mov         dword ptr [b],eax

Disaasembly at function with .code: 
hs_L_shl PROC


  ;  PROLOGUE START

   push  ebp                    
012D15B0  push        ebp  
   mov  ebp, esp
012D15B1  mov         ebp,esp  
   sub      esp, 24               
012D15B3  sub         esp,18h  
   push  ebx
012D15B6  push        ebx  
   push     esi
012D15B7  push        esi

Disaasembly at function with TEXT SEGMENT: 

  ;  PROLOGUE START

   push  ebp                   
012D15B0  push        ebp  
   mov  ebp, esp
012D15B1  mov         ebp,esp  
   sub      esp, 24                
012D15B3  sub         esp,18h  
   push  ebx
012D15B6  push        ebx  
   push     esi
012D15B7  push        esi
4

1 に答える 1

0

リターンアドレスが本来あるべき場所にないため、クラッシュします。関数は、スタックにプッシュされた 2 つのパラメーターを受け取ります。では、なぜ を使用しているのですか? 使用ret 0する必要がありますret 8

于 2013-03-08T12:43:09.400 に答える