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