寄存器
1 2 3 4 5 6 7 8 9 10 11
| #import <UIKit/UIKit.h> #import "AppDelegate.h"
int main(int argc, char * argv[]) { NSString * appDelegateClassName; @autoreleasepool { appDelegateClassName = NSStringFromClass([AppDelegate class]); } return UIApplicationMain(argc, argv, nil, appDelegateClassName); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| (lldb) register read General Purpose Registers: x0 = 0x000000016d79f808 x1 = 0x000000016d79f868 x2 = 0x000000016d79f878 x3 = 0x000000016d79f928 x4 = 0x0000000000000000 x5 = 0x0000000000000000 x6 = 0x0000000000000000 x7 = 0x0000000000000000 x8 = 0x0000000000000000 x9 = 0x7e666f59e9480095 x10 = 0x0000000102660968 `_mh_execute_header + 2408 x11 = 0x0000000080000028 x12 = 0x0000000080000028 x13 = 0x0000000000000000 x14 = 0x0000000000000881 x15 = 0x000000000000000c x16 = 0x000000010266606c `main at main.m:11 x17 = 0x0000000102710ed8 dyld`vtable for ImageLoaderMachOCompressed + 16 x18 = 0x0000000000000000 x19 = 0x0000000000000000 x20 = 0x0000000000000000 x21 = 0x0000000000000000 x22 = 0x0000000000000000 x23 = 0x0000000000000000 x24 = 0x0000000000000000 x25 = 0x0000000000000000 x26 = 0x0000000000000000 x27 = 0x0000000000000000 x28 = 0x000000016d79f858 fp = 0x000000016d79f820 lr = 0x00000001a45766b0 libdyld.dylib`start + 4 sp = 0x000000016d79f7f0 pc = 0x000000010266608c `main + 32 at main.m:12:16 cpsr = 0x60000000
(lldb)
|
通用寄存器
程序计数器
- pc (Program Counter)
- 记录CPU当前指令是哪一条指令
堆栈指针
- sp (Stack Pointer)
- fp (frame Pointer)
链接寄存器
- lr (Link Register)
- 存储着函数的返回地址
程序状态寄存器
- cpsr (Current Program Status Register)
- spsr (Saved Program Status Register)异常状态下使用
常用指令
MOV
ADD
1
| ADD {条件} {S} 目的寄存器, 操作数1, 操作数2
|
- ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。
- 操作数1应是一个
寄存器
;
- 操作数2可以是一个
寄存器
,被移位的寄存器
,或一个立即数
。
指令示例:
1 2 3
| ADD RO, R1, R2 ;RO = R1 + R2 ADD R0, R1, #0x1 ;R0 = R1 + 1 ADD RO, R2, R3, LSL#1 ;R0 = R2 + (R3<<1)
|
SUB
1
| SUB {条件} {S} 目的寄存器, 操作数1, 操作数2
|
- SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中;
- 该指令可用于有符号或无符数的减法运算;
- 操作数1应是一个寄存器;
- 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数;
指令示例:
1 2 3
| SUB RO, R1, R2 ;RO = R1 - R2 SUB R0, R1, #0x1 ;RO = R1 - 1 SUB RO, R2, R3, LSL#1 ;RO = R2 - (R3<<1)
|
CMP
- CMP指令用于把-一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT后缀的指令将可以执行。
指令示例:
1 2
| CMP R1, R0 ;将寄存器R1的值与寄存器RO的值相减,并根据结果设置CPSR的标志位 CMP R1, #0x1 ;将寄存器R1的值与立即数1相减,并根据结果设置CPSR的标志位
|
条件指令