ARM汇编

2021-04-14  本文已影响0人  生产八哥

汇编基本知识

高级语言可以通过编译得到汇编语言,汇编语言再编译成机器语言,机器语言也可以反汇编成汇编语言。每一条机器指令都有与之对应的汇编指令。在汇编中,大部分指令都是与CPU/内存相关的。

内存中除了指令,还有数据,但是都是0和1组合,CPU是如何区分的?是通过CPU上的部件PC寄存器来区分。因为在内存里数据和指令本质没有区别,那么要加以区分就是看是否被PC指向过,CPU将pc指向的内存单元的内容看做指令。

CPU会先将内存中的数据存储到通用寄存器中,然后再对寄存器中的数据进行运算


寄存器

针对arm64的CPU来说,
如果寄存器以x开头,则表明是一个64位的寄存器
如果寄存器以w开头,则表明是一个32位的寄存器
32位的寄存器是64位寄存器的低32位部分,并不是独立存在的

ARM64拥有有31个64位的通用寄存器 x0 到 x30,通常用来做数据计算的临时存储、累加、计数、地址保存等功能,和其他三个SP、PC、CPSR寄存器。 因为64位CPU可以兼容32位.所以可以只使用64位寄存器的低32位.w0 就是 x0的低32位。

FP(x29):保存栈帧地址,指向方法栈的底部
LR(x30):通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令
SP :保存栈指针,指向方法栈的顶部,使用 SP/WSP来进行对SP寄存器的访问。

可以通过register read 寄存器 来打印寄存器地址。

大部分操作系统栈的增长方向都是从上往下(包括iOS/Mac),Stack Pointer指向栈顶部,Frame Pointer指向上一栈帧的Stack Pointer值,通过Frame Pointer就可以递归回溯获取整个调用栈


常见命令

mov x1, x0   将寄存器x0的值复制到寄存器x1中

add x0, x1, x2 将寄存器x1和x2的值相加后保存到寄存器x0中

sub x0, x1, x2 将寄存器x1和x2的值相减后保存到寄存器x0中

and x0, x0, #0x1 将寄存器x0的值和常量1按位与后保存到x0中

orr x0, x0, #0x1 将寄存器x0的值和常量1按位或后保存到寄存器x0中

str x0, [x0, x8] 将寄存器x0中的值保存到栈内存 [x0 + x8]处

ldr x0, [x1, x2] 将寄存器x1和寄存器x2的值相加作为地址,取该内存地址的值放入寄存器x0中

stp x29, x30, [sp, #0x10] ; 将 x29, x30 的值存入 sp 偏移 16 个字节的位置

将内存区域的i值+1并赋值给a的步骤如下
mov x0, i   先将i值放到x0寄存器中
add x0, 1   将x0中的值+1
mov a , x0  赋值给x0
上一篇 下一篇

猜你喜欢

热点阅读