汇编原理
地址总线:它的宽度决定了cpu的寻址能力,如1G内存寻址能力是1024x1024x1024; 8086地址总线宽度是20根,所以寻址能力是1M(2的20次方)。
数据总线:它的宽度决定了cpu的单次数据传送量,也就是数据传送速度;8086的数据总线宽度是16,所以单次最大传递2个字节的数据;
控制总线:它的宽度决定了cpu对其他器件的控制能力、能有多少种控制,能控制的指令就越多;
数据宽度:
- 位(Bit):1个位就是1个二进制位0或者1
- 字节(Byte): 1个字节由8个Bit组成,内存中最小单元Byte
- 字(Word): 1个字由2个字节组成(16位),这2个字节分别为高字节和低字节
- 双字(Doubleword):1个双字由个字组成(32位)
寄存器
- 通用寄存器
pc寄存器(program counter)为指令指针寄存器,它指示了cpu当前要读取指令的地址
register write pc 0x111111 pc寄存器即将要执行的
ni 下一步执行
s 进入函数
sp任何时候会保存我们栈顶的地址
fp保存栈底的地址
cpsr
lr(x30): 将bl跳转的下一条指令的地址放入
指令:
bl指令:转移指令,跳转到内存地址,转到标号处执行指令
ret:默认使用lr寄存器的值,通过底层指令提示cpu此处为下条指令地址
函数的返回值通常都放在x0寄存器中
64位对栈的操作必须是16位如0x10 0x20 0x30等等
-
数据地址寄存器
64位:X0-X30,XZR(零寄存器)
32位:W0-W30,WZR(零寄存器) -
浮点和向量寄存器
浮点64位:D0-D31 32位:S0-S31
向量寄存器128位:v0-v31 -
异常状态寄存器
far
esr
exception -
内存读写指令
str(store register) 将数据从寄存器中读出来,存到内存中。
ldr(load register) 将数据从内存中读取出来,存到寄存器中。
ldr和str的变种ldp和stp可以操作2个寄存器。
栈
- 栈是一种特殊访问方式的存储空间(后进先出lifo)
- sp指向哪里哪里就是栈
- 由高地址往低地址走
堆:由低地址往高地址走
sub sp,sp,#0x20 // 内存开辟栈32个字节
stp x0,x1,[sp, #0x10] // 将寄存器x0,x1的值放到内存栈的sp+#0x10的位置
ldp x1,x0,[sp,#0x10] // 将内存数据读取到寄存器x1和x0中
add sp,sp,#0x20 // 栈平衡
网友评论