零寄存器
- wzr (32bit)
- xzr (64bit) Word Zero Register
在Xcode中
int main(int argc, char * argv[]) {
@autoreleasepool {
int a = 0;
long b = 0;
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
stur将寄存器wzr/xzr的值(0)存储到X29这个内存地址
零寄存器用来清空为0值,它的用途就是用来存放零,不能改写
register wzr
输出
invalid command 'register wzr'.
它的用途就是表示零寄存器
程序计数器
- pc (Program Counter)
- 记录CPU当前指令的是哪一条指令
- 存储着当前CPU正在执行的指令的地址
- 类似8086汇编的ip寄存器
在main函数打断点
register read
输出
General Purpose Registers:
x0 = 0x00000001000452e0 "class"
x1 = 0x0000000100045320 (void *)0x00000001000453c0: AppDelegate
x2 = 0x000000016fdc39d0
….
x27 = 0x0000000000000000
x28 = 0x000000016fdc39b0
fp = 0x000000016fdc3980
lr = 0x00000001000423d4 `main + 44 at main.m:17
sp = 0x000000016fdc3930
pc = 0x00000001000423e4 `main + 60 at main.m:19
cpsr = 0x80000000
可以看到最后pc = 0x00000001000423e4
记录CPU当前指令的是哪一条指令
如图,
lr寄存器: 链接寄存器(Link Register)
又称作为x30寄存器,存储着函数的返回地址,比如调用test函数,它会存储着下一条指令地址,等test函数运行完,接着运行下一条指令,这也就解释了bl指令的为什么能返回函数并继续运行下一条指令.
(lldb) register read lr
lr = 0x00000001000423d4 test`main + 44 at main.m:17
(lldb) register read x30
lr = 0x00000001000423d4 test`main + 44 at main.m:17