iOS相关的ARM汇编
一、iOS汇编
1、真机:arm64汇编
寄存器
指令
堆栈
2、模拟器:x86汇编
二、lldb
(lldb)register read x0
(lldb)register read w0
(lldb)register write x0 0x002a1b
(lldb)register read w0
(lldb)register read
三、生成汇编文件
xcrun -sdk iphoneos clang -S -arch arm64 main.c -o main.s
四、寄存器
1、 通⽤寄存器
64bit的:x0 ~ x28
32bit的:w0 ~ w28(属于x0 ~ x28的低32bit)
x0 ~ x7通常拿来存放函数的参数,更多的参数使用堆栈来传递 x0通常拿来存放函数的返回值
2、 程序计数器
pc(Program Counter) 记录CPU当前指令的是哪一条指令 存储着当前CPU正在执⾏的指令的地址 类似于8086汇编的ip寄存器
3、 堆栈指针
sp(Stack Pointer)
fp(Frame Pointer),也就是x29
4、 链接寄存器
lr(Link Register),也就是x30
存储着函数的返回地址
5、 程序状态寄存器
cpsr(Current Program Status Register)
spsr(Saved Program Status Register),异常状态下使⽤
![程序状态寄存器1](https://upload-images.jianshu.io/upload_images/8285086-429a8c7b1240c185.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![程序状态寄存器2](https://upload-images.jianshu.io/upload_images/8285086-df56d274823a76c4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
五、怎么编写汇编指令
1、在Xcode的OC文件中内嵌写入
__asm{
"mov x0, 100"
}
2、用Xcode新建.s文件里面写汇编代码
arm.h
#ifndef arm_h
#define arm_h void test(); int add(int a, int b);
int sub(int a, int b); #endif /* arm_h */
arm.s
// 声明一个代码段
.text
.global _test, _add, _sub // 内部\私有函数
mycode:
mov x0, #0x1
mov x1, #0x2
add x2, x0, x1
ret // test函数的实现
_test:
; bl指令(函数调用)
bl mycode
mov x3, #0x2
mov x4, #0x1 ; b指令带条件
; mov x0, #0x5
; mov x1, #0x5
; cmp x0, x1
; bgt mycode
; mov x0, #0x5
; ret ; mycode:
; mov x1, #0x6 ; b指令
; b mycode
; mov x0, #0x5
; mycode:
; mov x1, #0x6 ; cmp指令
; mov x0, #0x1
; mov x1, #0x3
; cmp x0, x1 ; mov指令
; mov x0, #0x8
; mov x1, x0 ; add指令
; mov x0, #0x1
; mov x1, #0x2
; add x2, x0, x1 ; sub指令
; mov x0, #0x5
; mov x1, #0x2
; sub x2, x0, x1
ret // add函数的实现
_add:
add x0, x0, x1
ret // sub函数的实现
_sub:
sub x0, x0, x1
ret
使用的时候跟C语言的使用方式一致,导入头文件,直接调用全局(global)函数。
iOS相关的ARM汇编的更多相关文章
- iOS 逆向之ARM汇编
最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...
- iOS程序破解——ARM汇编基础
原文在此:http://www.cnblogs.com/mddblog/p/4951650.html 一.Thumb指令与ARM指令 Thumb指令为16位,因此存储代码的密度高,节省存储空间.但是功 ...
- ARM汇编
ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- 大脸猫讲逆向之ARM汇编中PC寄存器详解
i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...
- ARM 汇编的mov操作立即数的疑问
1. 因为对arm汇编有些指令还不能理解,特别是一些相似功能指令间的区别.偶然在网上搜到"faq ARM assembly",其中描述的几个问题还是值得好好研究一下. 2. 慢慢的 ...
- GNU ARM 汇编指令
第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C ...
随机推荐
- stm32 uart 中断 蜜汁bug
在项目中,使用stm32f103,配置uart1接收RXNE中断,使用DMA来进行UART1的发送. 初始化代码如下: void uart_init(u32 bound) { GPIO_InitTyp ...
- python使用itchat发送微信消息提醒
最近在学习一点python,先找了找有趣的应用,实际修改跑了一下提高兴趣程度. 找到itchat,它的简介是这样的: “itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单. ...
- Javascript面向对象编程(二)
子承父业 该方法利用了call,apply,按照原有的方式进行复制,做一些改进,最后进行事务处理.废话不多说,直接看例子. 在这里我提一下,call和apply的异同:它们两个都可以改变this指向, ...
- tongweb安装后无法启动问题
安装后执行bin下的启动文件,但是管理界面依然无法打开 1.确认破解的dat文件是否在跟目录下,是否过期 2.如果jdk64位试试下面的方法:JAVA_HOME/jre/lib/ext/下缺少包 su ...
- Javascript FormData实例
一.创建一个formData对象实例的方式 1.创建一个空对象 var formData = new FormData();//通过append方法添加数据 1 2.使用已有表单来初始化对象 //表单 ...
- 四、Python-元组
列表非常适合用于存储在程序运行期间可能变化的数据集.列表是可以修改的,这对处理网 站的用户列表或游戏中的角色列表至关重要. Python将不能修改的值称为不可变的,而不可变的列表被称为元组 一.元组( ...
- spring boot aop 自定义注解 实现 日志检验 权限过滤
核心代码: package com.tran.demo.aspect; import java.lang.reflect.Method; import java.time.LocalDateTime; ...
- 通过日志来看Spring跨库更新操作的事务
场景介绍: 一个项目俩个数据源,连接俩个不同的库 数据源初始化 @Configuration @MapperScan(basePackages = "com.qing.mapper.paym ...
- orcal - 伪列
数据伪劣 行号 ROWNUM SELECT ROWNUM, empno,ename,sal from emp; 取出第一行数据 SELECT ROWNUM, empno,ename,sal from ...
- Django2.X报错-------ModuleNotFoundError: No module named 'django.core.urlresolvers'
django2.0 把原来的 django.core.urlresolvers 包 更改为了 django.urls包.所以将导入的包修改为django.urls.