历史上的今天
返回首页

历史上的今天

今天是:2024年12月23日(星期一)

正在发生

2019年12月23日 | iOS程序破解——ARM汇编基础

2019-12-23 来源:eefocus

一、Thumb指令与ARM指令

Thumb指令为16位,因此存储代码的密度高,节省存储空间。但是功能不全,它只是ARM指令(32位)集的补充,是ARM指令集下的一个子集。在初级阶段我们不需要了解这些知识,只要有个概念知道有这么个东西就可以。


二、ARM的寄存器初步了解

  R0-R3:        用于函数参数及返回值的传递,超过4个参数,其它参数存在栈中,在ARM中栈是向下生长的,R0还可以作为返回值。


  R4-R6, R8, R10-R11: 没有特殊规定,就是普通的通用寄存器
  R7:          栈帧指针,指向母函数与被调用子函数在栈中的交界。
  R9:          在iOS3.0被操作系统保留
  R12:          内部过程调用寄存器,动态链接时会用到,不必深究
  R13:          SP(stack pointer),是栈顶指针
  R14:          LR(link register),存放函数的返回地址。
  R15:          PC(program counter),指向当前指令地址。
  CPSR:         当前程序状态寄存器,在用户状态下存放像condition标志中断禁用等标志的。


  另外还有VFP(向量浮点运算)相关的寄存器,不在列举。


三、常用汇编

  助记符  说明 
  ADC    带进位的加法
  ADD    加法
  AND    逻辑与
  B      分支跳转,很少单独使用
  BL          分支跳转,跳转后返回地址存入r14
  BX          分支跳转,并切换指令模式(Thumb/ARM)
  CMP        比较值,结果存在程序状态寄存器,一般用于分支判断
  BEQ        结果为0则跳转
  BNE        结果不为0跳转
  LDR        加载寄存器,从内存加载到寄存器  
  LDRB      装载字节到寄存器  
  LDRH      装载半字到寄存器(一个字是32位)
  LSL         逻辑左移 这是一个选项,不是指令
  LSR         逻辑右移 这是一个选项,不是指令
  MOV        传送值/寄存器到一个寄存器 
  STR         存储一个寄存器,寄存器值存到内存 
  STRB       存储一个字节
  STRH       存储一个半字
  SUB         减法
  PUSH POP 堆栈操作


四、函数调用

  函数的参数、局部变量、返回地址都在栈上存着,这部分栈上的内存称为栈帧。和R0~R15(不一定全部)、CPSR等一起构成了函数的运行环境。每一个函数系统都会分配一个栈帧,执行完成后系统自动收回。每个函数都以为R0~R15、CPSR等CPU相关寄存器为自己一人享有,所以要做一些必要操作。


  举个例子:假设A调用B时,那么A要保存自己的运行环境(保存现场),B执行完后,要恢复A的运行环境(恢复现场);另外A还可以通过R0—R4来传递参数,参数超过4个可以通过栈,B返回时可以通过R0传递返回值。其中主要涉及的就是栈的操作和寄存器的操作。下图为函数调用前后栈的布局,左边为调用前,右边为调用后,当B返回时应回到左边状态(A调用B之前的状态,就像没有调用B一样)。

  在上图中,一个栈帧除了已经提到的参数区域(parameter area)、链接区域(linkage area)、局部变量存储区(local storage area)外还有栈帧指针存放区域(saved frame pointer)、寄存器存储区(saved registers area),栈帧指针上面已介绍(R7);寄存器存储区:保存非易失寄存器(R4,R5,R6,R8,R10,R11),后面的汇编代码例子会介绍。


  开始调用(现场保护):

  1)LR入栈;

  2)R7入栈,包存要恢复的寄存器入栈;

  3)R7 = SP地址;

  4)将callee会修改且在返回caller时需要恢复的寄存器入栈;

  5)分配栈空间给子程序使用。


  下图为汇编代码(使用hopper disassemble反编译的代码),分析如下:

  第一行:将LR, R7, R4-R6入栈;

  第二行:r7=sp-0xc(指向old R7),之所以减去0xc因为PUSH后,r4,r5,r6占去12个字节;

  第三行:保存要恢复的寄存器;

  第四行:给当前函数开辟栈空间。

  函数返回(恢复现场):

  1)释放栈空间;

  2)恢复所保存的寄存器;

  3)恢复R7;

  4)将之前存放的LR从栈上弹出到PC,这样函数就返回了。

  下图为汇编代码(使用hopper disassemble反编译的代码),分析如下:

  第一行:释放栈空间;

  第二行:恢复保存的寄存器;

  第三行:恢复保存的寄存器,恢复R7,将之前存放的LR从栈上弹出到PC。

推荐阅读

史海拾趣

Communications & Power Industries公司的发展小趣事

随着全球化进程的加速,CPI意识到要想在电子行业中取得更大的发展,必须积极拓展国际市场。公司积极寻求与国际知名企业的合作机会,通过技术共享和市场合作,成功打开了多个海外市场。同时,CPI还加强了与国际研究机构的合作,不断引进先进的技术和管理经验,提升了自身的竞争力。这些国际合作不仅为CPI带来了更多的商业机会,也推动了公司在全球范围内的品牌传播和市场拓展。

FRONTIER公司的发展小趣事

背景:FRONTIER Electronics作为一家专注于无源元件和集成无源元件设计与制造的公司,自成立以来便致力于技术创新。

发展故事:在21世纪初,FRONTIER Electronics凭借其在电感器、变压器、二极管等领域的深厚技术积累,成功推出了一系列高性能、高可靠性的电子产品。随着市场需求的不断增长,公司逐步扩大生产规模,并在全球范围内建立了完善的销售网络。通过持续的技术研发和市场拓展,FRONTIER Electronics逐渐在电子行业中崭露头角,成为该领域的领军企业之一。

BERNSTEIN公司的发展小趣事

在公司的快速发展中,BERNSTEIN公司逐渐将目光投向了国际市场。通过与国际知名企业的合作与交流,公司不断引进先进的技术和管理经验,提升了自身的竞争力。同时,BERNSTEIN公司的产品也逐渐在国际市场上赢得了广泛的认可和好评,为公司的发展注入了新的动力。

BULGIN公司的发展小趣事

BULGIN公司的历史可以追溯到1923年,当时A.F.Bulgin先生和他的同伴在英国创立了A.F.Bulgin有限公司。公司专注于无线电电子零件的制造与生产,凭借产品的优质口碑,BULGIN的品牌逐渐广为人知。随着订单的不断增加,公司迅速成长,并在二战前已经拥有了当时最先进的现代化大规模生产线。

Good Sky Electric Co Ltd公司的发展小趣事
在电气原理图中,互锁功能用于防止两个或多个接触器同时工作,以避免电路短路或设备损坏。例如,正反转按钮互锁就是防止电机在正转和反转之间突然切换,导致设备损坏。自锁功能则是指接触器在吸合后能够保持通电状态,即使按钮松开也不会立即断开电路,从而保证设备的持续运行。
General Industrial Controls ( GIC )公司的发展小趣事
固定输出版本包括3.3V、5V、12V,可调版本可以输出小于37V的各种电压。

问答坊 | AI 解惑

请大家帮忙设计一个驱动电路

单片机输出了调相波加驱动并隔离来控制单向可控硅,单片机已经输出经过零检测后的任意调相波形触发脉冲,来触发可控硅。一开始我使用了MOC的那种控制方式(带过零检测的光耦)如图,电路根本不稳定,触发不了,我怀疑是脉冲宽度不够,但是加宽了还 ...…

查看全部问答>

WINCE6调用拨号软件,报633的错误

我在wince6上调试一个PCIE接口的TD模块,厂家提供了一个驱动,改驱动模拟出三个串口,COM6,COM7,COM8, 其中COM6可能加载有问题,出现加载不成功的现象。其她两个口我用串口助手尝试过,是通的,可以收发消息。其中COM7, COM8是作为modem的端口 ...…

查看全部问答>

一个简单的广告灯程序 请高手指点!

1. 实验任务 利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。 麻烦帮忙检查下下面代码有什么问题,实在看不出来错在哪里 程序代码: ORG 0 START: MOV DPTR,#TABLE LOOP: CLR A MOVC A,@A+DPTR ...…

查看全部问答>

请问c中调用汇编的时候,写汇编函数应该是什么格式?

我是用S3C44B0X那个板子。在看demo程序的时候感到很困惑,有的汇编函数是前面加了下划线。有的却什么标示都没有,然后在C程序中稍加声明就可以直接调用了。 哪位大虾能不能说一下c中调用arm汇编函数,在编写的时候有什么格式和注意的吗?同样,如 ...…

查看全部问答>

cyclone iii外部有5V的信号,应该如何设置才能兼容?

cyclone iii外部有5V的信号,应该如何设置才能兼容?是一个AD7891的AD芯片的控制,逻辑电平是5v,数据通道上串了1k的电阻,输入逻辑电平还是5v…

查看全部问答>

想脱离固件库写底层,但没发现有针对各个功能单元的文档

                                 之前玩TI的DSP,象PLL.I2C,I2S,SPI,DMA等等之类的功能单元,都有单独的编程手册给出编程步骤,第一次接触STM32,以 ...…

查看全部问答>

分享有源功率计源代码

 分享有源功率计源代码    …

查看全部问答>

奉献一片LSD-FET430F22X4

参加LDS展会给的,LSD-FET430F22X4,可以奉献给需要的朋友。 需要电脑有并口。 …

查看全部问答>