Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在VisualStudio2010中,MASM文件不';行不通_Assembly_X86 - Fatal编程技术网

Assembly 在VisualStudio2010中,MASM文件不';行不通

Assembly 在VisualStudio2010中,MASM文件不';行不通,assembly,x86,Assembly,X86,如果我在VisualStudio2010项目中运行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, dwo

如果我在VisualStudio2010项目中运行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**
上面的代码在visual studio 2010中不起作用,如果我将
文本段
更改为
.code
段,则工作正常,
.code
文本段
之间有什么区别,但上面的代码在visual studio 2005中起作用

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

它崩溃是因为返回地址不是它应该在的位置。该函数接受推送到堆栈上的2个参数,对吗?那么为什么要使用
ret 0
,您应该使用
ret 8

查看此代码的反汇编如何?这应该会让你对错误和区别有一些了解。@AlexeyFrunze这段代码(如上所示)已经在asm中了。通过“反汇编”,可以理解将字节码转换为asm的过程。这不适用于此代码,因为它已经是asm。也许你的意思是反汇编生成的二进制文件?@zespri确切地说,反汇编生成的二进制文件,在两个地方:这个函数和调用它的函数。可能有不同的呼叫约定或类似的事情。你说的“不工作”是什么意思?它没有编译吗?还是它没有按预期运行?@selbie我想他在问题中解释了这一点,你可能错过了这一部分:“调用asm函数后它崩溃了”。因此,基本上当应用程序在输入asm代码后运行时,应用程序崩溃。这就是我的理解。如果他使用的是cdecl调用约定,代码中就指出了这一点(注意
.model flat,c
调用后的
添加esp,8
指令)。