Windows中文网

 找回密码
 立即注册
搜索
查看: 9395|回复: 0

64位汇编有关的基础知识

[复制链接]

19

主题

22

帖子

428

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
428
发表于 2021-10-10 10:04:34 | 显示全部楼层 |阅读模式
64位CPU除了段寄存器以外,其余的都是64位(8字节),64位的通用寄存器在数量上增加了8个,共有16个通用寄存器,其中8个是为了兼容32位的,将原来的名称由E**改为了R**,例如EAX改为RAX,其余8个分别命名为R8~R15;EIP和EFLAGS都改为RIP和RFLAGS;浮点寄存器还是64位,分别是MMX0(FPR0)~MMX7(FPR7);增加了8个128位的多媒体寄存器XMM8~XMM15,XMM0等多媒体寄存器又是256位寄存器YMM0等的低128位。

RAX等8个通用寄存器如果需要取其中的低32位、低16位、低8位可以使用相应的寄存器进行存取,例如对于RAX来说分别是EAX、AX、AL;R8等后来按序号命名的寄存器取64位、低32位、低16位、低8位分别用R8、R8D、R8W、R8B。

64位程序的函数调用有所不同,64位程序的函数调用约定最多可以把4个函数参数通过寄存器来进行传递,前4个参数从左到右依次存放于RCX、RDX、R8和R9寄存器,从第5个参数开始还是通过堆栈来进行传递(从右到左的入栈顺序),64位程序的新式函数调用约定可以明显地加快函数调用的速度。在64位程序中,进行函数调用时通常不再使用PUSH指令来传递参数,而是通过MOV指令把参数传递到寄存器或堆栈,由调用者负责堆栈平衡(和__cdecl一样)。

在64位程序中,函数的前4个参数通过寄存器进行传递,从第5个参数开始还是通过堆栈来进行传递(从右到左的入栈顺序)。如果是整型参数,函数的前4个参数从左到右依次存放于RCX、RDX、R8和R9寄存器;如果是浮点参数,则函数的前4个参数从左到右依次存放于XMM0、XMM1、XMM2和XMM3寄存器;如果既有整型又有浮点型,例如VOID func(int a,double b, int c, double d),则函数的前4个参数从左到右依次存放于RCX(ECX)、XMM1、R8(R8D)和XMM3寄存器。如果被调用函数的返回值是64位以内(包括64位)的整型或指针,返回值存放于RAX寄存器;如果返回值是浮点型,则返回值存放于XMM0寄存器。


回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋|Windows中文网 ( 鲁ICP备2021014210号 )

GMT+8, 2025-6-9 20:16 , Processed in 0.076247 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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