RSSReader icon indicating copy to clipboard operation
RSSReader copied to clipboard

求教 arm架构下为什么指令地址是栈帧地址末位置0得到的

Open xuezhulian opened this issue 7 years ago • 11 comments

const uintptr_t reAddress = ((address) & ~(3UL)); const uintptr_t reAddress = ((address) & ~(1UL)); 没有找到相关理论 依据

xuezhulian avatar Sep 19 '18 06:09 xuezhulian

指令寄存器地址=framePointer地址-1,const uintptr_t reAddress = ((address) & ~(3UL)); 这个结果相当于address-1,只是在不同cpu架构下写的方式不同 ,这个理解对吗? @ming1016 请大佬指正~

ChengwenY avatar Apr 11 '19 09:04 ChengwenY

在arm64架构下地址指针的长度是47位比如一个地址指针是0x7faf1b580450 转换成二进制 11111111010111100011011010110000000010001010000 最后的3位是没有用的,可以用来存储其它的信息,所以我们在取地址的时候要忽略掉最后面的三位

xuezhulian avatar May 09 '19 02:05 xuezhulian

ARM64 处理器ios的指针存储长度为36(0x100f0bd50),有效长度为33,有效长度33中有3位用于对齐, 也就是说最终的有效长度为30, X86_64 处理器ios 的指针存储长度为48(0x7f8221c10c90), 有效长度为47, 有效长度47中有3位用于对齐,也就是说最终的有效长度为44

zzxzyz avatar Jul 23 '19 07:07 zzxzyz

arm64 指针是4字节对齐,arm 指针是2字节对齐,x86_64和i386 都是1字节对齐,通过IDA反汇编可以清晰的看到指针长度

zzxzyz avatar Jul 23 '19 07:07 zzxzyz

arm64 指针是4字节对齐,arm 指针是2字节对齐,x86_64和i386 都是1字节对齐,通过IDA反汇编可以清晰的看到指针长度 const uintptr_t reAddress = ((address) & ~(3UL)); 有一点疑问,这个不是把address末两位置0吗

YaoJuan avatar May 15 '20 10:05 YaoJuan

末两个为0,不就是4个的整数倍吗

zzxzyz avatar May 26 '20 14:05 zzxzyz

末两个为0,不就是4个的整数倍吗

在 2020-05-15 18:16:15,"YaoJuan" [email protected] 写道:

arm64 指针是4字节对齐,arm 指针是2字节对齐,x86_64和i386 都是1字节对齐,通过IDA反汇编可以清晰的看到指针长度 const uintptr_t reAddress = ((address) & ~(3UL)); 有一点疑问,这个不是把address末两位置0吗

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

zzxzyz avatar May 26 '20 14:05 zzxzyz

ARM64 处理器ios的指针存储长度为36(0x100f0bd50),有效长度为33,有效长度33中有3位用于对齐, 也就是说最终的有效长度为30, X86_64 处理器ios 的指针存储长度为48(0x7f8221c10c90), 有效长度为47, 有效长度47中有3位用于对齐,也就是说最终的有效长度为44

你好,这个有相关的文档可以看么

yFeii avatar Jun 05 '20 00:06 yFeii

ARM64 处理器ios的指针存储长度为36(0x100f0bd50),有效长度为33,有效长度33中有3位用于对齐, 也就是说最终的有效长度为30, X86_64 处理器ios 的指针存储长度为48(0x7f8221c10c90), 有效长度为47, 有效长度47中有3位用于对齐,也就是说最终的有效长度为44

还有 为什么 pc不用 像lr那样做对齐处理((address) & ~(3UL))

image

yFeii avatar Jun 05 '20 00:06 yFeii

ARM64 处理器ios的指针存储长度为36(0x100f0bd50),有效长度为33,有效长度33中有3位用于对齐, 也就是说最终的有效长度为30, X86_64 处理器ios 的指针存储长度为48(0x7f8221c10c90), 有效长度为47, 有效长度47中有3位用于对齐,也就是说最终的有效长度为44

还有 为什么 pc不用 像lr那样做对齐处理((address) & ~(3UL))

image

因为pc本来就是4个字节对齐的啊,看汇编代码,pc都是4字节偏移

YaoJuan avatar Jun 09 '20 09:06 YaoJuan

末两个为0,不就是4个的整数倍吗 在 2020-05-15 18:16:15,"YaoJuan" [email protected] 写道: arm64 指针是4字节对齐,arm 指针是2字节对齐,x86_64和i386 都是1字节对齐,通过IDA反汇编可以清晰的看到指针长度 const uintptr_t reAddress = ((address) & ~(3UL)); 有一点疑问,这个不是把address末两位置0吗 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

懂了,谢谢

YaoJuan avatar Jun 09 '20 09:06 YaoJuan