ecall

ecall

RISC-V 汇编 参考

lyszt.net 更详细地介绍了 ecall 和其他 RISC-V 指令。

描述

ecall 要求你的程序所运行的环境执行一项服务。汇编可以加减和移动数字,但屏幕、键盘和其他设备属于承载程序的系统,因此代码本身无法访问它们。ecall 代表 environment call(环境调用)。它停止你的代码,由宿主执行服务,然后控制权返回到你的代码。宿主在真实硬件上是操作系统,而在这个模拟器中就是模拟器本身。

程序指定它想要的服务。按照惯例,服务编号放在 a7 中,服务所需的任何数据放在 a0 中,然后运行 ecall。这个模拟器提供以下服务:1 打印 a0 中的整数,4 打印 a0 中地址处的文本,5 从输入读取一个数字到 a0,10 结束程序,32 暂停 a0 毫秒。

要打印一个数字,将 1 加载到 a7 以选择打印服务,将数字加载到 a0,然后运行 ecall。示例就是这样做的。服务 10 结束程序,这就是课程以下面两行结束的原因。没有它,处理器会越过最后一行继续执行后面的内容。

li a7, 10
ecall

RISC-V 手册指出,ecall 向执行环境发出服务请求,环境决定参数如何传递,通常使用已定义的整数寄存器。这个模拟器就是这里的环境,它定义了上面列出的服务编号。手册还指出,ecall 曾经名为 scall。它的搭档 ebreak 将控制权返回给调试器。两者都会向环境引发一个精确的请求陷阱。

完整的操作系统以相同方式工作,只是服务列表更长。

示例

li a7, 1     # service 1 = print integer
li a0, 42
ecall        # prints 42