飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2765|回复: 0

[原创] X64基本数据表达---自己的一些感悟.

[复制链接]
  • TA的每日心情
    开心
    2022-7-9 18:18
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2019-3-23 10:25:32 | 显示全部楼层 |阅读模式
    [C++] 纯文本查看 复制代码
    #include "stdafx.h"
    #include <Windows.h>
    struct mypass
    {
    	int a;
    	int b;
    	char szName[0x255];
    	INT64 attible;
    };

    写一个简单的demo然后我们可以得出一点小的结论
    实验证明:
    结构体内的数据,int 为4字节长度,char数组按4字节对齐,int64占用8位,
    传参方式:_stdcall 的方式的参数传递依次为 :R9,R8,RDX,RCX参数还是从右往左
    返回值跟32位一样,仍然保存在*ax寄存器里
    比如:
    [C++] 纯文本查看 复制代码
    HWND myhwnd = ::FindWindowEx(NULL, NULL, mystr, L"test");
    000000013F515D78  lea         r9,[string L"test" (013F519DB0h)]  
    000000013F515D7F  lea         r8,[mystr]  
    000000013F515D86  xor         edx,edx  
    000000013F515D88  xor         ecx,ecx  
    000000013F515D8A  call        qword ptr [__imp_FindWindowExW (013F521158h)]  
    000000013F515D90  mov         qword ptr [myhwnd],rax  
    float类型则通过mmx寄存器来进行传递,占用长度与32位相同仍为4字节
    [C++] 纯文本查看 复制代码
    float myfloat = 3.1415;
    000000013F8E5D23  movss       xmm0,dword ptr [__real@40490e56 (013F8E9C20h)]  
    000000013F8E5D2B  movss       dword ptr [myfloat],xmm0  
    	float mydest = myfloat;
    000000013F8E5D33  movss       xmm0,dword ptr [myfloat]  
    000000013F8E5D3B  movss       dword ptr [mydest],xmm0  
    //========================================================================================================
    	float myfloat = 3.1415;
    000000013F765D73  movss       xmm0,dword ptr [__real@40490e56 (013F769C20h)]  
    000000013F765D7B  movss       dword ptr [myfloat],xmm0  
    	float mydest = round(myfloat);
    000000013F765D83  movss       xmm0,dword ptr [myfloat]  
    000000013F765D8B  call        round (013F761401h)  
    000000013F765D90  movss       dword ptr [mydest],xmm0  
    浮点型参数
    xmm0...8?用来传递浮点类型,如果有返回值则结果保存在xmm0里
    以上为初探X64做的笔记希望可以帮到坛友.

    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表