首页
社区
课程
招聘
[求助]64位下对象的this指针保存在什么寄存器中供函数内部访问的?
发表于: 2007-9-11 21:42 6741

[求助]64位下对象的this指针保存在什么寄存器中供函数内部访问的?

2007-9-11 21:42
6741
函数返回值是通过rax的吗?

参数入栈,只有rcx、rdx、r8、r9。。。这种顺序吗?

没有64位机供测试,今天看64位下的反汇编,看得云里雾里。。。

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
2
适合于 64 位的返回值是通过 RAX 返回的(包括 __m64 类型),但 __m128、__m128i、__m128d、浮点值和双精度值除外,它们是在 XMM0 中返回的。如果返回值不适合于 64 位,则由调用方为返回值分配指针并将其作为第一个参数传递。然后,后续参数将向右侧移动一个参数的位置。RAX 中的被调用方必须返回相同的指针。要返回的用户定义类型的长度必须为 1、2、4、8、16、32 或 64 位。

          Visual C++  
寄存器使用  
请参见   
全部折叠 全部展开    语言筛选器: 全部 语言筛选器: 多个 语言筛选器: Visual Basic 语言筛选器: C# 语言筛选器: C++ 语言筛选器: J# 语言筛选器: JScript  
Visual Basic(声明)
Visual Basic (用法)
C#
C++
J#
JScript

x64 结构提供了 16 个通用寄存器(以后称为整数寄存器),以及 16 个可供浮点使用的 XMM 寄存器。易失寄存器是由调用方假想的临时寄存器,并要在调用过程中销毁。非易失寄存器需要在整个函数调用过程中保留其值,并且一旦使用,则必须由被调用方保存。

下表说明了每种寄存器在整个函数调用过程中的使用方法:

Register
状态
请使用

RAX
易失的
返回值寄存器

RCX
易失的
第一个整型参数

RDX
易失的
第二个整型参数

R8
易失的
第三个整型参数

R9
易失的
第四个整型参数

R10:R11
易失的
必须根据需要由调用方保留;在 syscall/sysret 指令中使用

R12:R15
非易失的
必须由被调用方保留

RDI
非易失的
必须由被调用方保留

RSI
非易失的
必须由被调用方保留

RBX
非易失的
必须由被调用方保留

RBP
非易失的
可用作帧指针;必须由被调用方保留

RSP
非易失的
堆栈指针

XMM0
易失的
第一个 FP 参数

XMM1
易失的
第二个 FP 参数

XMM2
易失的
第三个 FP 参数

XMM3
易失的
第四个 FP 参数

XMM4:XMM5
易失的
必须根据需要由调用方保留

XMM6:XMM15
非易失的
必须根据需要由被调用方保留。

请参见
参考
x64 软件约定

要提出有关“帮助”或本产品其他功能的建议或错误报告,请转到 反馈站点.
2007-9-11 22:35
0
雪    币: 419
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢foxabu。对象指针保存在哪个寄存器,以供成员函数访问的呢?
2007-9-11 23:06
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
4
不好意思  我这里也没有安装编译器 微软的文档上面也没有说 但是按照规则应该是RCX 这个我也不确定 你可以查查资料。
2007-9-11 23:16
0
游客
登录 | 注册 方可回帖
返回
//