
image.png
arm汇编语言支持对不同类型数据的操作;可以load(或store)的数据类型,包括signed/unsigned words,halfwords后者bytes
- "-h(无符号)"或者"-sh(有符号)"后缀表示half words
- "-b"或者"-sb"表示bytes
- 无后缀表示默认words.
有符号和无符号类型之间的区别: - 有符号可以表示正值和负值,范围较小
- 无符号只能表示正值,所以表示范围更大
下面使用load和store指令操作不同类型数据的示例:
ldr = Load Word
ldrh = Load unsigned Half Word
ldrsh = Load signed Half Word
ldrb = Load unsigned Byte
ldrsb = Load signed Bytes
str = Store Word
strh= Store unsigned Half Word
strsh = Store signed Half Word
strb = Store unsigned Byte
strsb = Store signed Byte
字节序:

image.png
在内存中有两种存储多字节数据的方式,大端序和小端序
详见之前的一篇博文:
https://www.jianshu.com/p/a019572cb5d8
ARM架构在ARMv3之前是小端序的,
在那之后,ARM处理器可以通过硬件配置在大小端之间切换。
以ARMv6为例,指令是固定的以小端序存储的,而内存数据的读取方式可以通过控制程序状态寄存器CPSR的第9位实现在大端和小端之间切换。

image.png
ARM寄存器
| 寄存器 | 别名 | 作用 |
|---|---|---|
| R0 | - | 通用 |
| R1 | - | 通用 |
| R2 | - | 通用 |
| R3 | - | 通用 |
| R4 | - | 通用 |
| R5 | - | 通用 |
| R6 | - | 通用 |
| R7 | - | 常用于保存系统调用号 |
| R8 | - | 通用 |
| R9 | - | 通用 |
| R10 | - | 通用 |
| R11 | FP | 用于保存栈帧 |
| 专用寄存器 | ||
| R12 | IP | 内部调用暂存寄存器 |
| R13 | SP | 栈顶指针 |
| R14 | LR | 用于保存函数返回地址 |
| R15 | PC | 用于保存下一条指令的地址 |
| CPSR | - | 当前程序状态寄存器 |
| ARM | 简述 | x86 |
|---|---|---|
| r0 | 通用寄存器 | EAX |
| r1-r5 | 通用寄存器 | EBX,ECX,EDX,ESI,EDI |
| r6-r10 | 通用寄存器 | - |
| r11 | 栈帧寄存器 | EBP |
| r12 | 内部调用暂存寄存器 | - |
| r13(sp) | 堆栈寄存器 | ESP |
| r14(LR) | 链接寄存器 | |
| r15(pc) | 程序计数器 | eip |
| CPSR | 当前程序状态寄存器 | EFLAGS |
ARM与X86寄存器做了一个简单类比:
| ARM | 简述 | x86 |
|---|---|---|
| r0 | 通用寄存器 | EAX |
| r1-r5 | 通用寄存器 | EBX,ECX,EDX,ESI,EDI |
| r6-r10 | 通用寄存器 | - |
| r11 | 栈帧寄存器 | EBP |
| r12 | 内部调用暂存寄存器 | - |
| r13(sp) | 堆栈寄存器 | ESP |
| r14(LR) | 链接寄存器 | |
| r15(pc) | 程序计数器 | eip |
| CPSR | 当前程序状态寄存器 | EFLAGS |
ARM的函数调用约定:
函数的前四个参数存储在r0-r3之中;