汇编使用特性小讲解

2018-10-11  本文已影响0人  MagicalGuy
// 01调用约定.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//1.c调用方式 :从右到左入栈,函数外部平衡堆栈
int _cdecl fun_cdecl(int a,int b)
{
    return a + b;
}

//2.stdcall windowsAPI调用约定 :从右到左入栈,函数内部平衡堆栈 : ret 8
int _stdcall fun_stdcall(int a, int b)
{
    return a + b;
}


//3.fastcall快速调用约定 :从右到左入栈,函数内部平衡堆栈 
int _fastcall fun_fastcall(int a, int b,int c,int d )
{
    return a + b+c+d;
}

//4.this c++调用约定    从右到左入栈,函数内部平衡堆栈
class OBJ {
public:
    int  fun_thiscall(int a, int b, int c, int d)
    {
        return a + b + c + d;
    }
    int m_number;
};


int main()
{
    //1.c调用方式
    //fun_cdecl(1, 2);

    //2.stdcall windowsAPI调用约定
    //fun_stdcall(1, 2);

    //3.fastcall快速调用约定
    //fun_fastcall(1, 2,3,4);

    //4.this c++调用约定
    OBJ obj;
    obj.fun_thiscall(1, 2, 3, 4);
    return 0;
}

================

// 02x64汇编.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//x64函数调用
long long fun(long long a, long long b, long long c, long long d, long long x)
{
    return a + b + c + d + x;

}

int main()
{
    //64位调用
    fun(0x1, 0x2, 0x3, 0x4, 0x5);

    return 0;
}

==================

// 03裸函数.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//裸函数 编译器不做任何优化
void _declspec(naked) fun1()
{
    _asm mov eax,99
    _asm ret
    
}

//普通函数
void fun2()
{
    //会添加开辟栈帧
}


int main()
{
    //1.裸函数函数调用
    fun1();
    //2.普通属性
    fun2();
    return 0;
}

===================

// 04x64混合编程.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//声明函数
extern "C" long add_fun(int a, int c);


int main()
{
    //调用汇编函数
    int a =add_fun(5, 6);
    return 0;
}

asmfun.asm

.code

;加法操作 rcx:参数1,rdx:参数2
add_fun proc
    xor rax,rax
    mov rax,rcx
    add rax,rdx
    ret 
add_fun endp

end

X64混合编程
1.设置VS的编译环境为X64
2.添加一个.asm的文件
3.设置项目属性

image.png image.png

4.设置文件属性


image.png image.png

5.在asm中编写汇编代码

image.png

6.在源文件中声明外部函数

// 声明一个外部函数,来自其它文件
// extern"C" 防止C++的名称粉碎机制,被c++名称粉碎机制糟蹋后
// 链接器就会报无法解析的外部符号的错误。
// 因为.asm文件的函数名没有经过名称粉碎机制
extern"C" int Max( int left , int right );

上一篇下一篇

猜你喜欢

热点阅读