零寄存器

在Xcode中

int main(int argc, char * argv[]) {
    @autoreleasepool {
        int a = 0;
        long b = 0;
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

demo

stur将寄存器wzr/xzr的值(0)存储到X29这个内存地址

零寄存器用来清空为0值,它的用途就是用来存放零,不能改写

register wzr

输出

invalid command 'register wzr'.

它的用途就是表示零寄存器

程序计数器

在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当前指令的是哪一条指令

如图,

demo

又称作为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