Assembly 在VisualStudio2010中,MASM文件不';行不通
如果我在VisualStudio2010项目中运行ASM文件,则在调用ASM函数后它将崩溃 使用asm代码:-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
.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
指令)。