当前位置:文档之家› 汇编实例

汇编实例

// TestAsm.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

00D7136E int 3
00D7136F int 3
--- d:\visual studio 2008\projects\testasm\testasm\testasm.c -------------------
// TestAsm.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
00D71370 push ebp
00D71371 mov ebp,esp
00D71373 sub esp,0C0h
00D71379 push ebx
00D7137A push esi
00D7137B push edi
00D7137C lea edi,[ebp-0C0h]
00D71382 mov ecx,30h
00D71387 mov eax,0CCCCCCCCh
00D7138C rep stos dword ptr es:[edi]
return 0;
00D7138E xor eax,eax
}
00D71390 pop edi
00D71391 pop esi
00D71392 pop ebx
00D71393 mov esp,ebp
00D71395 pop ebp
00D71396 ret
--- No source file -------------------------------------------------------------
00D71397 int 3
00D71398 int 3

《Windows环境下的32位汇编语言程序设计》
罗云彬

函数调用规则
在一个编写高级语言的程序员的观念中,函数(或者没有返回值的过程)是必不可少的基础单元。C语言的程序完全由函数构成,所有的代码都在某一个函数中。
函数调用规则指的是调用者和被调用函数间传递参数及返回参数的方法,在Windows上,常用的有Pascal方式、WINAPI(_stdcall)、C方式(_cdecl)。
_cdecl C调用规则:
(1)参数从右到大进入堆栈;
(2)在函数返回后,调用者要负责清除堆栈,所以这种调用常会生成较大的可执行程序。
_stdcall
(1) 参数从右到左进入堆栈;
(2)被调用的函数在返回前自行清理堆栈,所以生成的代码比_cdecl小。
此外,在windows内核中还常见有快速调用方式(_fastcall);在C++编译的代码中有this call方式(_thiscall)。
debug,release版本
int MyFunction(int a, int b)
{
int c = a + b;
int i;

for ( i=0; i<50; i++ )
{
c = c + i;
}

return c;
}


int _tmain(int argc, _TCHAR* argv[])
{
//return 0;
//MyFunction(0, 0);
int a[5];

a[0] = 1;
a[1] = 3;
a[2] = 5;
a[3] = 7;

return 0;

}

int _tmain(int argc, _TCHAR* argv[])
{
01192DA0 push ebp
01192DA1 mov ebp,esp
01192DA3 sub esp,0DCh
01192DA9 push ebx
01192DAA push esi
01192DAB push edi
01192DAC lea edi,[ebp-0DCh]
01192DB2 mov ecx,37h
01192DB7 mov eax,0CCCCCCCCh
01192DBC rep stos dword ptr es:[edi]
//return 0;
//MyFunction(0, 0);
int a[5];

a[0] = 1;
01192DBE mov dword ptr [a],1
a[1] = 3;
01192DC5 mov dword ptr [ebp-14h],3
a[2] = 5;
01192DCC mov dword ptr [ebp-10h

],5
a[3] = 7;
01192DD3 mov dword ptr [ebp-0Ch],7

return 0;
01192DDA xor eax,eax

}

int c = a + b;
00BB17CE mov eax,dword ptr [a]
00BB17D1 add eax,dword ptr [b]
00BB17D4 mov dword ptr [c],eax
int i;

for ( i=0; i<50; i++ )
00BB17D7 mov dword ptr [i],0
00BB17DE jmp MyFunction+39h (0BB17E9h)
00BB17E0 mov eax,dword ptr [i]
00BB17E3 add eax,1
00BB17E6 mov dword ptr [i],eax
00BB17E9 cmp dword ptr [i],32h
00BB17ED jge MyFunction+4Ah (0BB17FAh)
{
c = c + i;
00BB17EF mov eax,dword ptr [c]
00BB17F2 add eax,dword ptr [i]
00BB17F5 mov dword ptr [c],eax
}
00BB17F8 jmp MyFunction+30h (0BB17E0h)

return c;
00BB17FA mov eax,dword ptr [c]
}
00BB17FD pop edi
00BB17FE pop esi
00BB17FF pop ebx
00BB1800 mov esp,ebp
00BB1802 pop ebp
00BB1803 ret

相关主题
文本预览
相关文档 最新文档