type
status
date
slug
summary
tags
category
icon
password
LEGv8 指令集
LEGv8 指令集是 ARMv8 指令集的子集,适用于嵌入式系统
LEGv8 架构中共有 32 个 64 位寄存器,其中:
通用寄存器(General-Purpose Registers,GPRs)
31个,编号 X0-X30,用于存储数据和执行算数逻辑操作
- X0-X7:用于函数调用时传递参数和返回结果,如果参数超过8个,多余的存到栈帧中
- X8:用于间接返回结果的地址
- X9-X15:用于临时变量存储数据,不需要保留数据
- X16-X17(IP0-IP1):可能被链接器用作临时寄存器,或者作为普通的临时寄存器
- X18:用于平台无关的代码的平台寄存器,或者作为普通的临时寄存器
- X19-X27:用于保存数据,需要在函数调用前后保持不变,其中的一个寄存器可作为基址寄存器
- X28(SP):用于指向堆栈顶部的地址,存储临时数据和函数调用信息,栈由高地址向低地址增长,随着数据压栈,SP会向低地址移动,栈中的数据段称为栈帧
- X29(FP):用于指向当前函数的栈帧的底部,即高地址处,在函数调用期间,栈帧会被动态地创建和销毁,因此栈帧指针会变动
- X30(LR):用于存储函数调用返回地址,即函数执行完毕后应该继续执行的下一条指令的地址,这个地址会被加载到程序计数器(PC)中,从而跳回到函数原点继续执行后面的指令
特殊寄存器(Special Registers)
- X31(XZR):零寄存器,值恒为0,用于一些特定操作,如清零或与零比较
- PC:程序计数器,用于存储当前需要执行的指令的地址
汇编语言
机器语言
为了满足不同的操作需求和优化指令的执行效率,机器语言的指令格式被区分了多种类型,其中
R型指令格式:用于表示寄存器之间的操作。适用于仅涉及寄存器操作的指令,如加法、逻辑运算等
opcode:指令操作 | Rm:第二源寄存器 | shamt:位移量 | Rn:第一源寄存器 | Rd:目标寄存器 |
11位 | 5位 | 6位 | 5位 | 5位 |
例:将 ADD X9,X20,X21 转为二进制机器语言
10001011000 | 10101 | 000000 | 10100 | 01001 |
ADD操作码 | 寄存器X21 | 位移0 | 寄存器X29 | 寄存器X9 |
D型指令格式:用于表示寄存器和常数值之间的操作。适用于使用常数或即时数据的指令,如加载、存储和立即数运算等
opcode:指令操作 | address:偏移量 | op2:操作扩展 | Rn:源寄存器 | Rt:目标寄存器 |
11位 | 9位 | 2位 | 5位 | 5位 |
例:将 LDUR X9,[X10,#240] 转为二进制机器语言
11111000010 | 011110000 | 00 | 01010 | 01001 |
LDUR操作码 | 基址偏移量 | ㅤ | 基址寄存器X10 | 寄存器X9 |
除了R型、D型,还有I型、B型、J型、S型、U型等
内存管理
低地址 | ㅤ | ㅤ | ㅤ | 高地址 |
空闲 | 代码段 | 静态数据 | 动态数据(堆) | 栈 |
ㅤ | ㅤ | ㅤ | →向高地址增长 | ←向低地址增长 |
堆和栈此消彼长
- Author:风之旅人
- URL:https://www.hrmi.fun//article/jsjzcysj
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!