masm下几种常见函数调用方式

简介:

    masm没有fastcall调用方式,其特点为:

1 第一个参数放入ecx,第二个参数放入edx;

2 如果有剩余参数则从右向左压栈;

3 被调用函数清理栈(平衡栈);

4 若有返回值放入eax;

5 name函数实际生成得函数名为@name@4*参数个数

比如有带有2个参数的foo函数则实际名称为:@foo@8


    syscall调用方式:

1 不对函数名做任何修饰;

2 从右向左压栈;

3 被调用函数清理栈;


    stdcall调用方式:

1 name函数名实际生成得函数名称为:_name@4*参数个数;

2 其他与syscall相同;


    C调用方式

1 name函数实际名称为 _name;

2 从右向左压栈;

3 由调用函数清理栈;


    值得注意的是,如果一个函数为 : public syscall foo,其在一个.model为stdcall的文件中,则此代码无法ml成功。一个解决方法是将所有syscall函数放在一个单独的.model为syscall的文件中,比如foo函数,然后在.model为stdcall的主文件中引用foo:

foo proto syscall :DWORD,:DWORD

最后用link将2个obj链接即可。

相关文章
VC8 常用代码汇编 返回值,入参,全局变量
VC8 常用代码汇编 返回值,入参,全局变量
|
30天前
|
编译器 Linux C语言
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
22 0
|
1月前
|
存储 编译器 C语言
|
5月前
|
C++
汇编 -- c++/c 多函数调用
汇编 -- c++/c 多函数调用
23 0
|
C语言
gcc编译时传递宏定义
gcc编译时传递宏定义
202 0
|
存储 编译器 API
Win32汇编:过程与宏调用
在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种`后进先出(LIFO,Last-In,First-Out)`的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时总是被加到堆栈的最顶端,数据也总是从堆栈的最顶端被取出,堆栈是个`特殊的存储区`,主要功能是暂时存放数据和地址,通常用来保护断点和现场.
89 0
|
编译器 C++
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决
C++编译提示宏重定义了,怎么办?
C++编译提示宏重定义了,怎么办?
859 0
|
存储 安全 IDE
使用C编译器编写shellcode
有时候程序员们需要写一段独立于位置操作的代码,可当作一段数据写到其他进程或者网络中去。该类型代码在它诞生之初就被称为shellcode,在软件中黑客们以此获取到shell权限。方法就是通过这样或那样的恶意手法使得这段代码得以执行,完成它的使命。当然了,该代码的编写仅能靠它自己,作者无法使用现代软件开发的实践来推进shellcode的编写。
218 0
使用C编译器编写shellcode