Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
xuezhulian opened this issue Sep 19, 2018 · 11 comments

Comments

@xuezhulian
Copy link

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

@ChengwenY
Copy link

ChengwenY commented Apr 11, 2019

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

@xuezhulian
Copy link
Author

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

@zzxzyz
Copy link

zzxzyz commented Jul 23, 2019

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

@zzxzyz
Copy link

zzxzyz commented Jul 23, 2019

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

@YaoJuan
Copy link

YaoJuan commented May 15, 2020

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

@zzxzyz
Copy link

zzxzyz commented May 26, 2020

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

@zzxzyz
Copy link

zzxzyz commented May 26, 2020 via email

@yFeii
Copy link

yFeii commented Jun 5, 2020

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

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

@yFeii
Copy link

yFeii commented Jun 5, 2020

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

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

image

@YaoJuan
Copy link

YaoJuan commented Jun 9, 2020

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
Copy link

YaoJuan commented Jun 9, 2020

末两个为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.

懂了,谢谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants