CPU:运算器、控制器、寄存器 , 控制总线、数据总线、地址总线
一个字节Byte有8个bit就是8个二进制位,16进制时一个F四个1111,两个F就是八个1,FF时11111111,两个F就是一个字节;一个int类型占4个字节,一个字节8个bit,4*8=32位, 8个F可以表示一个int类型
64位CPU,64/8=8,8个字节,
CPU通过总线与外界联系p &cTemp打印内存地址 ,command+shift+M 粘贴内存地址查看内存
一个字由两个字节组成
ARM64拥有31个64位的通用寄存器X0到X30 ,W0到W28,SP、PC、CPSR
PC寄存器为指令指针寄存器,它指示CPU当前要读取指令的地址,CPU将PC指向的内存单元的内容看做指令
bl指令叫做转移指令是专门修改PC寄存器的值的,即修改下一步要读取指令的地址
register write pc 0x1011168bc 强行修改pc寄存器的
ARM64中 :XZR零寄存器
浮点寄存器 64位:D0~D31 32位:S0~S31
向量寄存器 128位:V0-V31
栈
堆栈是内存中的一个数据结构.
内存如同一个仓库,堆栈是仓库中开辟的一个规则有序的后进先出的仓库区,而寄存器就是生产线上的一个容器。堆栈是属于内存区的一部分,而寄存器则是CPU中的一部分。
ARM64下,函数的参数存放在x0到x7(w0到w7)这8个寄存器,如果超过8个会入栈,函数的返回值是放在x0寄存器,函数的局部变量放在栈里面
关于内存读写指令:
Str指令将数据从寄存器中读出来,存到内存中(写内存)
ldr指令从内存中读出来,存到寄存器中
str和ldr的变种寄存器 stp和ldp可以操作2个寄存器. stur 和ldup也是变种寄存器,一般表示负数
例子:
sub sp,sp,#0x20 //因为是16进制的, 拉伸栈空间32个字节,往低地址拉伸。
stp x0,x1,[sp,#0x10] //x0,x1是寄存器,sp是栈顶,栈在内存中,stp指令的意思是将寄存器中的东西放到内存中,所以这句话的意思是sp往上加16个字节用来存放x0,x1中的东西
ldp x1,x0,[sp,#0x10] //将sp往上读16个字节的东西拿出来放到x1,x0寄存器中
add sp,sp,#0x20 //上面减一下,这里加一下,让栈平衡
函数的返回值通常放在x0寄存器里