软件看得到的机器契约
机器程序需要知道指令编码怎样解释、哪些寄存器可见、操作会怎样改变状态,以及怎样读取和写入内存。ISA为这些行为提供约定,让编译器、汇编器和执行实现有共同目标;它不只是指令助记符的目录。
RISC-V手册明确把ISA描述为多种实现的软件可见接口,并区分更完整的执行环境。可用内存区域、异常处理和系统服务还受环境约定影响,因此只认出指令编码,不代表已经具备运行某个完整应用所需的全部条件。
参考:[1]
以RV32I的寄存器和加法为例
RV32I基本整数模型有32个32位整数寄存器,其中x0固定为零,另有保存当前指令地址的程序计数器。加法等指令规定读取哪些操作数、怎样计算并写到目标寄存器;存储器访问又通过相应读取和写入指令完成。
例如RV32I的ADD保留结果低32位,并不因整数加法溢出而产生算术异常。这个具体机器规则不能代替高级语言自己的整数规则。汇编文本、编码后的指令和高级语言表达式,是需要通过相应工具与语义联系起来的不同层次。
参考:[2]
兼容范围与实现方式
同一ISA可以由不同流水线、缓存及乱序执行设计实现,也可通过软件模拟。只要满足适用的可观察规则,实现内部可以有很大差异;因此ISA兼容不意味着相同功耗、时钟数或运行速度。
架构名称还可能覆盖基本集与扩展的组合。RISC-V的RV32I与RV64I是不同基本集,可选浮点、原子等扩展也需核对;面向某种扩展生成的二进制,不能只凭机器统称支持RISC-V就假定可用。函数调用、文件格式和系统环境还需要对应ABI等约定。