Github地址:carloscn/uncle-ben-os at car_lab_01 (github.com)
ARMv8指令集介绍
- A64指令集只能运行在aarch64
所有A64汇编都是32 bits宽的
- 关注指令的应用、有什么limitation
- A64能拜访的地址数据是64位宽的
A64反对全副的大写或者小写形式
- ARM官网大写
- 利用应用小写
寄存器命名
- Wn示意32bits宽的寄存器
- Xn示意64bits宽的寄存器
- WZR示意32位内容全为0的寄存器
- XZR示意64位内容全为0的寄存器
- ...
LDR指令
LDR Xd, [Xn, $offset]
- 【释义】:将Xn寄存器中存储的地址+offset地址偏移存 组成一个新的地址,把这个地址外面存储的值放在Xd寄存器中。[]有取地址内存储的数值的含意。
【示例】:
- S1: 应用MOV指令把0x80000加载到X1寄存器:
MOV x1, 0x80000
(如果是一个数,而非#0x80000, 则是一个地址) - S2: 应用MOV指令把16数值加载到X3寄存器:
MOV x3, 16
- S3: 应用LDR指令读取X1地址外面存储的值,存储到X0中:
LDR x0,[x1]
, 这个不容许->LDR x2,[0x80000]
- S4:应用LDR指令读取X1 + 8地址外面存储的值,存储到X2中:
LDR x2,[x1, #8]
- S5:应用LDR指令读取(X1 + X3)地址外面存储的值,存储到X4中:
LDR x4,[x1, x3]
- S6: 应用LDR指令读取(X1+(X3<<3))地址外面存储的值,存储到X5中:
LDR x5,[x1,x3,lsl #3]
- S1: 应用MOV指令把0x80000加载到X1寄存器:
【留神】:
- 给的数不加任何标记的视为地址
- 须要给立刻数的场景而非地址的值,应用#
- []有取地址值的意思
- LDR lsl扩大指令,只反对1和3
LDR x2,[x1, #8]
x1的值不会被更新为0x80008
【变基模式】:
- 前变基模式 pre-index: 先更新偏移地址,后拜访地址
- 后变基模式 post-index: 先拜访内存地址,再更新偏移地址
GDB-Tips
启动GDB和QEMU链接
> gdb-multiarch --tui benos.elf
gdb> c
gdb> target remote localhost:1234
gdb> b ldr_test
// 设定断点gdb> c
gdb> next
//下一步gdb> info register
// 查看所有寄存器gdb> info x1 x2 x3
// 查看x1/x2/x3寄存器gdb> x 0x80000
// 读取内存0x80000值 32位gdb> x/xg 0x80000
// 读取内存0x80000值64位