已经熟悉了x86汇编,所以其他的理论就不多记了,主要是记录以下这些。

iphon5s以上都是arm64的设备
armv6 设备:iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 设备:iPhone3GS, iPhone4, iPhone4S
           iPad, iPad2, iPad3(The New iPad), iPad mini
           iPod Touch 3G, iPod Touch4
armv7s设备:iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 设备:iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)

最常用汇编指令
str 将数据从寄存器中读取存放到内存
ldr 将内存中的数据读取放到寄存器
bl  跳转

32位寄存器
R0-R3   //函数的前4个参数放在R0-R3中,其他的参数放到栈中,返回值在R0   
R7  
R9
R13    //SP寄存器
R14    //LR寄存器,保存函数返回地址
R15    //PC寄存器

32位的寄存器容量是8位,64位寄存器的容量16位的,数量也更多一些,x1,x2,x3...
---------------------------------------------------------------------

以下是64位的arm汇编的一个实例,理解arm汇编的函数调用的过程。
打开Xcode,新建ios工程,在main.m下写如下代码

#import <UIKit/UIKit.h>
#import "AppDelegate.h"int funcAdd(a,b,c,d,e,f)
{int g=a+b+c+d+e+f;return g;
}
int main(int argc, char * argv[]) {funcAdd(1, 2, 3, 4, 5, 6);@autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}
}

在Xcode菜单栏选择Product=>Perform Action => Assemble main.m, 注意选择在真机编译才能生成arm汇编,在模拟器是x86的。
显示代码有很多.loc开头的鬼东西,为了看着方便可以删掉。

_funcAdd:                               ; @funcAdd
Lfunc_begin0:.loc   1 13 0                  ; /Users/exchen/Desktop/armasm/armasm/main.m:13:0.cfi_startproc
; BB#0:sub  sp, sp, #32             ; =32
Ltmp1:.cfi_def_cfa_offset 32str w0, [sp, #28]               ;将w0寄存器的值放入sp+28,第1个参数astr w1, [sp, #24]               ;将w1寄存器的值放入sp+24,第2个参数bstr w2, [sp, #20]               ;将w2寄存器的值放入sp+20,第3个参数cstr w3, [sp, #16]               ;将w3寄存器的值放入sp+16,第4个参数dstr w4, [sp, #12]               ;将w4寄存器的值放入sp+12,第5个参数estr w5, [sp, #8]                ;将w5寄存器的值放入sp+8, 第6个参数f.loc    1 14 11 prologue_end    ; /Users/boot/Desktop/armasm/armasm/main.m:14:11
Ltmp2:ldr   w0, [sp, #28]               ;将第1个参数a放入w0寄存器ldr  w1, [sp, #24]               ;将第2个参数b放入w1寄存器add   w0, w0, w1             ;将w0和w1的值相加并存入w0寄存器ldr  w1, [sp, #20]               ;将第3个参数e放入w1寄存器add   w0, w0, w1                         ;将w0和w1的值相加并存入w0寄存器ldr  w1, [sp, #16]               ;将第4个参数d放入w1寄存器add   w0, w0, w1             ;将w0和w1的值相加并存入w0寄存器ldr  w1, [sp, #12]               ;将第5个参数e放入w1寄存器add   w0, w0, w1             ;将w0和w1的值相加并存入w0寄存器ldr  w1, [sp, #8]                ;将最后一个参数f放入w1寄存器add  w0, w0, w1             ;将w0和w1的值相加并存入w0寄存器str  w0, [sp, #4]                    ldr w0, [sp, #4]add sp, sp, #32             ; =32ret
Ltmp3:
Lfunc_end0:

这是在真机运行的汇编代码和上面是一样的。

armasm`funcAdd:0x1000389f0 <+0>:  sub    sp, sp, #320x1000389f4 <+4>:  str    w0, [sp, #28]0x1000389f8 <+8>:  str    w1, [sp, #24]0x1000389fc <+12>: str    w2, [sp, #20]0x100038a00 <+16>: str    w3, [sp, #16]0x100038a04 <+20>: str    w4, [sp, #12]0x100038a08 <+24>: str    w5, [sp, #8]
->  0x100038a0c <+28>: ldr    w0, [sp, #28]0x100038a10 <+32>: ldr    w1, [sp, #24]0x100038a14 <+36>: add    w0, w0, w10x100038a18 <+40>: ldr    w1, [sp, #20]0x100038a1c <+44>: add    w0, w0, w10x100038a20 <+48>: ldr    w1, [sp, #16]0x100038a24 <+52>: add    w0, w0, w10x100038a28 <+56>: ldr    w1, [sp, #12]0x100038a2c <+60>: add    w0, w0, w10x100038a30 <+64>: ldr    w1, [sp, #8]0x100038a34 <+68>: add    w0, w0, w10x100038a38 <+72>: str    w0, [sp, #4]0x100038a3c <+76>: ldr    w0, [sp, #4]0x100038a40 <+80>: add    sp, sp, #320x100038a44 <+84>: ret    

main函数里调用funcAdd的过程

 .globl  _main.align 2
_main:                                  ; @main
Lfunc_begin1:.loc   1 17 0 is_stmt 1        ; /Users/exchen/Desktop/armasm/armasm/main.m:17:0.cfi_startproc
; BB#0:stp  x29, x30, [sp, #-16]!mov     x29, spsub sp, sp, #64             ; =64
Ltmp4:.cfi_def_cfa w29, 16
Ltmp5:.cfi_offset w30, -8
Ltmp6:.cfi_offset w29, -16orr   w8, wzr, #0x1   ;和mov w8,#0x1是一样的orr    w9, wzr, #0x2   ;同上orr  w2, wzr, #0x3orr    w3, wzr, #0x4movz   w4, #0x5orr w5, wzr, #0x6stur   wzr, [x29, #-4]stur w0, [x29, #-8]stur   x1, [x29, #-16]
    mov    x0, x8mov    x1, x9         ;到这我们发现,函数参数1-6依次存放到w0-w5,或者说是x1-x5,这和32位是有很大区别的。bl     0x1000d09f0    ;调用funcAdd 

main函数真机运行的汇编代码

armasm`main:0x1000d0a48 <+0>:   stp    x29, x30, [sp, #-16]!0x1000d0a4c <+4>:   mov    x29, sp0x1000d0a50 <+8>:   sub    sp, sp, #640x1000d0a54 <+12>:  orr    w8, wzr, #0x1     0x1000d0a58 <+16>:  orr    w9, wzr, #0x20x1000d0a5c <+20>:  orr    w2, wzr, #0x30x1000d0a60 <+24>:  orr    w3, wzr, #0x40x1000d0a64 <+28>:  movz   w4, #0x50x1000d0a68 <+32>:  orr    w5, wzr, #0x60x1000d0a6c <+36>:  stur   wzr, [x29, #-4]0x1000d0a70 <+40>:  stur   w0, [x29, #-8]0x1000d0a74 <+44>:  stur   x1, [x29, #-16]
->  0x1000d0a78 <+48>:  mov    x0, x80x1000d0a7c <+52>:  mov    x1, x90x1000d0a80 <+56>:  bl     0x1000d09f0               ; funcAdd at main.m:13

iOS Hacker Xcode玩转arm64汇编基础相关推荐

  1. iOS Hacker Xcode使用和内联汇编

    1.在C/C++/Objective C调用汇编函数 在iOS工程里新建Assemble文件,编写代码 .text .align 4 .globl _funcAdd_arm_funcAdd_arm:a ...

  2. C IN ARM64 汇编基础-变量与表达式-基于The C Programming Language - Second Edition

    C源代码: #include <stdio.h>/* print Fahrenheit-Celsius table for fahr = 0, 20, ..., 300 */ main() ...

  3. xcode armv7 armv7s arm64

    armv6 armv7 armv7s arm64引起编译包翻倍增大的问题,下边来说一下关于ios这个指令集 目前ios的指令集有以下几种: armv6 iPhone iPhone2 iPhone3G ...

  4. iOS Hacker 重签名实现无需越狱注入动态库 dylib

    iOS Hacker 重签名实现无需越狱注入动态库 dylib 一.获取 ipa 文件 iOS 的应用都是打包成 ipa 的文件格式,ipa 文件实际上就是 zip 格式的文件,通过 unzip 可以 ...

  5. iOS Hacker 动态库 dylib 注入

    iOS Hacker 动态库 dylib 注入 很多情况下我们希望自己写的代码能够在其他应用中运行,如果代码简单的话,可以写 Tweak 或者使用 Cycript.但如果代码多的话,那最好是写一个动态 ...

  6. iOS Hacker 使用Theos开发tweak

    iOS Hacker 使用Theos开发tweak mkdir /opt export THEOS=/opt/theos sudo git clone git://github.com/DHowett ...

  7. 【汇编实战开发笔记】ARM汇编基础的三大块知识

    文章目录 1 前言 2 ARM知识图谱 3 ARM汇编基础三大块 3.1 寻址方式 3.1.1 立即寻址 3.1.2 寄存器寻址 3.1.3 寄存器偏移寻址 3.1.4 寄存器间接寻址 3.1.5 基 ...

  8. 【ios开发/Xcode】使用UITableView完成学生信息及成绩的显示

    [ios开发/Xcode]使用UITableView完成学生信息及成绩的显示 设计思想 实现效果 源代码 设计思想 首先创建所有页面的故事版,包括,登录.注册与成绩页面 接着设置故事版的关联代码,如下 ...

  9. 【ios开发/Xcode】实现登录注册

    [ios开发/Xcode]实现登录注册 实现效果 源代码 实现效果 首先进入初始界面,输入账号Linchuantao,密码Linchuantao,显示登录失败(如下左图),因此需要进行注册,点击左下角 ...

最新文章

  1. 物联网是怎样把世界联系起来的
  2. SAP PP 为工单确认时自动做收货的设置
  3. 计算机专业文档写作课件,计算机专业论文写作的方法.ppt
  4. Reading Club week 3 prepare document
  5. python 曲线拟合_Python实现数学模型(插值、拟合和微分方程)
  6. Web使用热敏打印小票(IE环境)
  7. Zookeeper: Zookeeper架构及FastLeaderElection机制
  8. 普通大学生的 Java 开发能力到什么水平才能进大厂?
  9. python建模大赛算法_Python数据分析kaggle-Titanic+天池-工业蒸汽量预测建模算法
  10. 汇编语言常见错误(转载)
  11. php堆栈溢出,php - 警告:php_eval() - 堆栈内存溢出
  12. 《自己动手写网络爬虫》读书笔记——队列与集合
  13. pubg解封验证计算机怎么验证,绝地求生解封教程
  14. 10、Linux上常见软件的安装:安装JDK、安装Tomcat、安装Eclipse
  15. 计算机基本办公软件应用技能有哪些,办公人员应掌握哪些办公软件技能
  16. 赛后复盘 - DataCastle 科大讯飞AI营销算法大赛
  17. java获取wps文档字数
  18. 国科大计算机体系结构考试专用
  19. windows设置路由信息
  20. 【JavaScript 逆向】AST 技术反混淆

热门文章

  1. [BZOJ 2734] 集合选数
  2. 【SIP协议】学习初学笔记
  3. iOS判断是模拟器还是真机
  4. 2015年第六届蓝桥杯本科B组C++省赛个人题解
  5. java与c++的区别-转
  6. 使用pthread和线程池实现B+树的并行块加载bulkload过程
  7. [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)
  8. 【python数据挖掘课程】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取
  9. 【数据结构与算法】之深入解析“回文数”的求解思路和算法示例
  10. RxSwift之订阅UITableViewCell里的按钮点击事件