找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 16018|回复: 5

[转载]64位汇编的浮点参数传递

  [复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-7-7 20:41:24 | 显示全部楼层 |阅读模式
来源:http://www.x64asm.com/AsmBbs/viewthread.php?tid=413
作者:晓风残月
关于64位浮点参数传递一直停留在理论阶段,只知道资料上说是通过XMM0-XMM3这4个SSE寄存器传递,没有实际测试过,但是测试出来的结果却不一样,浮点参数仍然通过通用寄存器传递,有人会问什么了,整数寄存器怎么传递浮点参数,呵呵,听我慢慢解释(靠,谁扔的鸡蛋,用得着这么心急么)
    浮点数分单精度,双精度和扩展精度,扩展精度不太常用,而且我也没研究出来怎么传递,暂不讨论。单精度浮点数数据长度为32位,双精度浮点数据长度为64位,同样可以定义为dword 和 qword,只是在内存中的表现形式和整数不一样,如果用mov指令则只能传送整数。传送浮点数到通用寄存器需要一定的技巧,这里需要使用到SSE指令集,先通过SSE寄存器把数据编码为浮点格式,然后通过SSE字节传送指令原封不动的把浮点编码格式的数据传递到通用寄存器。
    在程序中用到2个SSE指令,MOVSD和MOVD:
      MOVSD ( Move Scalar Double-Precision Floating-Point Value ) 传送标量双精度浮点值
    指令格式:movsd    dest, src
      两个操作数可以是通用寄存器,SSE寄存器,和内存操作数,不支持立即数
    MOVD ( Move Doubleword )传送双字节
    指令格式:movd    dest, src
      两个操作数可以是通用寄存器,SSE寄存器和内存操作数,不支持立即数
    下面我们来实际看下代码应用

  1. .data
  2.         szdll                byte        "msvcrt.dll", 0
  3.         szSprintf        byte        "sprintf", 0
  4.         szcaption        byte        "test x64 float point past", 0
  5.         szformat        byte        "test x64 float point past : %.3f, %.2f, %f", 0
  6.         val1                qword        123.5432
  7.         val2                qword        321.6543
  8.         val3                qword        123456.9876
  9. .data?
  10.         szbuffer        byte        50        dup        ( ? )

  11. .code
  12.         main        proc
  13.                 sub        rsp, 38h
  14.                 lea        rcx, szdll
  15.                 call        GetModuleHandle
  16.                 mov        rcx, rax
  17.                 lea        rdx, szSprintf
  18.                 call        GetProcAddress
  19.                 lea        rcx, szbuffer
  20.                 lea        rdx, szformat
  21.                 movsd        xmm0, val1 ; 传送到SSE寄存器编码为浮点格式
  22.                 movd        r8, xmm0 ; 双字节传送到通用寄存器
  23.                 movsd        xmm0, val2
  24.                 movd        r9, xmm0
  25.                 movsd        xmm0, val3
  26.                 movd        qword ptr [ rsp + 20h ], xmm0 ; 第5个参数是浮点参数也通过堆栈传递,因为堆栈是8字节的,所以要用qword ptr关键字指定操作大小,否则会按4字节传递,即movd dword ptr [ rsp + 20h ]
  27.                 call        rax
  28.                 xor        rcx, rcx
  29.                 lea        rdx, szbuffer
  30.                 lea         r8, szcaption
  31.                 xor         r9, r9
  32.                 call        MessageBox
  33.                 xor        rax, rax
  34.                 jmp        ExitProcess
  35.         main        endp
  36. end
复制代码

把此程序编译后就能看到结果了。

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2011-7-13 12:34:19 | 显示全部楼层
晓风残月?
貌似很出名的一个人。

1

主题

39

回帖

0

精华

铜牌会员

积分
299
发表于 2011-9-28 00:22:18 | 显示全部楼层
呵呵!

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2011-9-28 00:41:21 | 显示全部楼层
x64asm 发表于 2011-9-28 00:22
呵呵!

欢迎X64ASM站长光临!

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-12 16:39:39 | 显示全部楼层
M 。。多學習才行啊

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-5-1 16:32:33 | 显示全部楼层
好文章需支持!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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