arm 简单汇编

1、寻址方式:

mov r0, #1234

相当于:r0=#1234。#开头,表示16进制时,以0x开头,如#0x1f。

mov r0, r1

执行后,r0 = r1。

LSL:逻辑左移,移位后寄存器空出的低位补0;

LSR:逻辑右移,移位后寄存器空出的高位补0;

ASR:算数右移,移位过程中,符号位保存不变,如果源操作数为正数,则移位后空出的高位补0,否则补1。

ROR:循环右移,移位后,移出的低位,填入移位空出的高位。

RRX:带扩展的循环右移,操作数右移一位,移位空出的高位,用C标志的值填充。

mov r0, r1, lsl #2

相当于:r0 = r1<<2 = r1*4。

ldr r0, [r1]    // 取值

相当于:r0 = *r1。

2、寄存器

ARM 有16个寄存器:

- r0-r3 主要用来传递函数调用第1到第4个参数(a0-a3),更多的参数须通过栈来传递。

- r0-r1 也作为结果寄存器,保存函数返回结果;被调用的子程序在返回前无须恢复这些寄存器的内容。

- r4-r9 为被调保存(callee-save)寄存器,一般保存内部局部变量(local variables)。

- r7 大部分情况用来保存系统调用号(syscall number)。

- r9 某些变体可能当作特殊寄存器。

- r10(SL)被调保存寄存器,Stack Limit。

- r11(FP)被调保存寄存器, 帧指针(Flame Pointer)。

- r12(IP)特殊寄存器,栈寄存器(Intra Procedure)。

- r13(SP)特殊寄存器,栈指针,类似x86_64中的RSP。

- r14(LR)特殊寄存器。Link Register.

- r15(PC)特殊寄存器。Program Counter (like RIP in x86_64 & EIP in x86).

被调保存寄存器(callee-save register)是指,如果这个寄存器被调用/使用之前,需要被保存。

值得注意的是,通常 ARM 模式下 r11 会作为帧指针,THUMB 模式下 r7 则作为帧指针。但在系统有可能根据自己的需要改变这个约定。

然后说明下,LR 或 Link Register(链接寄存器),这个寄存器会保存一个子程序(subroutine/函数)的返回值。当一个子程序被调用时,LR 会被填入程序计数器(PC)。

还有 PC 寄存器,该寄存器或保存目前正在执行的内存地址。

PC 和 LR 都是跟代码有关的寄存器,一个是 Where you are,另外一个是 Where you were。

再者,SP 寄存器,该寄存器指向栈顶。该栈是一块用来存储本地函数的内存区域。当函数被返回时, 存储空间会被回收。

在堆栈上分配空间, 需要从栈寄存器(the stack register)减去。

分配一个32位的值, 需要从堆栈指针(the stack pointer)减去4。

ARM堆栈结构是从高向低压栈的。

因为处理器是32位的ARM,所以每压一次栈,SP就会移动4个字节(32位),也就是sp = sp-4。

你可能感兴趣的:(arm 简单汇编)