美文网首页
汇编使用特性小讲解

汇编使用特性小讲解

作者: MagicalGuy | 来源:发表于2018-10-11 00:17 被阅读0次
    // 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 );

    相关文章

      网友评论

          本文标题:汇编使用特性小讲解

          本文链接:https://www.haomeiwen.com/subject/rwtyaftx.html