arm64汇编篇-015指针的反汇编

本文介绍了ARM64架构下指针的反汇编过程,通过代码示例展示了如何处理指针操作,包括将栈空间内存赋值给寄存器、在栈中存储数据,以及理解数组指针的使用方式。文中还提到,虽然不能直接对数组指针进行arr++操作,但可以通过类型转换和递增新变量实现类似效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针的反汇编

1.输入如下代码:

void func (){
  int * a;
  int b = 10;
  a = &b;
}

2.真机运行断点调试如图:
指针的反汇编
3.解析:

1.将栈空间四个字节内存给x8寄存器
2.将10赋值给w9寄存器
3.将w9寄存器的值存储到x8寄存器指向的内存空间
4.将x8的值存储在sp偏移8个单位空间,即栈空间。(局部变量是保存在栈中的寄存器不保存数据

  • 数组指针
    1.代码如下:
void func()
{
  int arr[5] = {
  
  1,2,3,
反汇编Linux/Windows OS运行的32位/64位程序/动态库文件,CPU类型:ARM PowerPC MIPS X86 操作菜单选择:文件解析 Alx+P ELF文件解析 Alt+E 另有CORE文件解调用栈、文本比较等功能。V2.0.3相对上一版本,完善ARM64、X8664、PPC64反汇编、ko反汇编,完善反汇编文本文件比较、IQ数据解析,修复小BUG;V2.0.2相对上一版本,完善ARM64、X8664反汇编ARM64位core文件调用栈,完善文本文件比较、增加高亮、查找功能,修复小BUG;V2.0.0相对上一版本,完善ARM64反汇编ARM64位core文件调用栈,完善C++符号名字解析,支持工具运行在英文版OS;V1.26.01相对上一版本,增加ARM64反汇编64位core文件解析;V1.26.00相对上一版本,增强EXE反汇编,增加dbx老邮件解析、二维码功能;V1.25.07相对上一版本,增加二进制反汇编、IQ数据解析功能,完善MIPS反汇编,修复小BUG;V1.25.05相对上一版本,增加内存数据按数据类型解析功能;V1.25.04相对上一版本,完善X86反汇编,修复小BUG;V1.25.02相对上一版本,COREDUMP统计、匹配目标文件等相关功能优化,修复小BUG;V1.25.00相对上一版本,相关功能支持动态库文件,查询代码支持无符号目标文件+有符号目标文件,COREDUMP统计、与问题单关联、目标文件/CORE文件/问题单同步;V1.24.02相对上一版本,针对进程主动捕捉异常的信息定制处理进一步完善COREDUMP文件解析与应用,增强软件管理;V1.24.01相对上一版本,进一步完善COREDUMP文件解析与应用,提供部分ARM Thumb指令反汇编;V1.24.00相对上一版本,进一步完善COREDUMP文件解析与应用,提供堆栈调用关系分析;V1.23.03相对上一版本,提供32位X86反汇编;V1.23.02相对上一版本,提供源代码行查询指令地址,OBJ/COREDUMP文件解析,sprintf函数参数特定检查,完善文件拖放操作,修复小BUG;V1.23.01相对上一版本,提供ELF文件指令修改,修复ARM MLS指令反汇编错误等BUG;V1.23.00相对上一版本,提供程序地址对应源代码行查询,修复MIPS调试信息错误;V1.22相对上一版本,修复MIPS小端字节序反汇编错误,网上最新版本提示;V1.21相对上一版本,菜单调整,完善64位ELF文件解析,解析调试信息;另部分增强功能的菜单操作设有密码,如有兴趣欢迎咨询。欢迎大家反馈相关软件使用过程中的问题!
### 关于ARM64汇编语言的经典示例代码 #### 生成汇编文件 为了编写和调试ARM64汇编代码,可以先从简单的C程序入手并将其转换为汇编代码。以下是生成汇编文件的方法[^1]: ```bash xcrun --sdk iphoneos clang -S -arch arm64 main.c -o main.s ``` 此命令会将`main.c`中的C代码编译成针对ARM64架构的汇编代码。 --- #### 使用内嵌汇编 如果希望在C程序中直接嵌入ARM64汇编代码,则可以通过特定的关键字实现。对于GNU ARM编译器而言,支持使用`__asm__`关键字来完成这一操作[^2]。下面是一个经典的例子,展示如何比较两个整数并返回较大的那个值[^3]: ```c int compare_data(int a, int b) { register int result; __asm__ volatile ( "cmp %1, %2\n\t" // 比较寄存器中的a和b "movge %0, %1\n\t" // 如果a >= b,则result = a "movlt %0, %2\n\t" // 否则result = b : "=r"(result) // 输出约束条件 : "r"(a), "r"(b) // 输入约束条件 : "cc" // 修改标志位 ); return result; } ``` 上述代码展示了如何利用ARM64汇编指令集中的`cmp`(比较)、`movge`(当大于等于时移动)以及`movlt`(当小于时移动)。这些指令能够高效地处理分支逻辑而无需显式的跳转语句。 --- #### 反汇编分析 除了手动编写汇编代码外,也可以通过对已有的二进制文件进行反汇编学习其内部结构。例如,在ARM架构下的简单函数调用可能会被翻译为如下形式[^4]: ```assembly eb000000 bl c @ 调用子函数c eafffffe b 8 @ 条件跳转回到地址8处继续执行 e1a0c00d mov ip, sp @ 将栈指针(sp)复制到中间寄存器(ip) ``` 这里可以看到一些基本的操作码及其功能解释,比如`bl`用于带链接的跳转,`b`表示无条件跳转,而`mov`则是数据传输指令之一。 --- #### 推荐经典教程资源 对于初学者来说,可以从官方文档或者社区分享的学习资料起步。以下是一些推荐方向: - **《ARM Architecture Reference Manual》**:这是最权威的技术手册,涵盖了所有关于ARM处理器体系结构的信息。 - **在线课程平台上的专项培训视频**:如Coursera、Udemy等网站上都有专门讲解低级编程技巧的相关课程。 - **书籍阅读**:像《Professional Assembly Language》这样的书本也提供了丰富的实例供读者模仿练习。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值