You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无栈、无间接寻址及受限指令集CPU的子程序调用可行性问询

无栈、无间接寻址及受限指令集CPU的子程序调用可行性问询

嘿,这个问题刚好戳中了极简指令集CPU的核心痛点——咱们先把矛盾点拆透:你要实现子程序调用,核心需求是先保存当前程序计数器(PC)的值,等子程序跑完再跳回这个地址,但你的CPU既没法直接读取或存储PC,也没有间接寻址/间接跳转能力,指令集还只给了那有限的几条,确实棘手。

先给你一个明确的结论:在你设定的严格约束下(不能用自修改代码,也不能提前通过汇编器硬编码每个调用点的返回地址),完全无法实现通用的子程序调用,原因有两个关键:

  1. 你没法捕获返回地址:现有指令里没有任何方式能把当前PC的值(也就是调用子程序指令的下一条指令地址)读入寄存器或内存——load A只能加载固定地址的内容,load immediate只能加载常数,都拿不到PC的动态值。
  2. 就算你能把返回地址存起来,也没法跳回去:你的jump指令只能跳转到固定的目标地址(操作数是编译时确定的),没有间接跳转(比如jump (A)这种用寄存器值作为目标地址的指令),所以就算内存里存了返回地址,也没法用它完成跳转。

那有没有变通方式?其实也有,但都突破了你设定的约束:

  • 如果允许汇编器提前硬编码:你可以在每个调用子程序的位置,手动把返回地址写到内存,然后给子程序做多个副本,每个副本末尾的jump指令跳回对应的返回地址——但这本质上不是通用子程序,只是重复代码,完全失去了子程序复用的意义。
  • 如果允许自修改代码:调用子程序前,先把返回地址写到子程序末尾jump指令的操作数位置,这样子程序执行完就能跳回正确的地址——但你明确排除了这种方式。

如果不想突破约束,那唯一的替代方案就是把需要复用的代码直接内联(inline),也就是把重复的代码段复制到每个需要的地方,虽然会增加代码量,但能实现逻辑复用的效果,这也是早期很多极简CPU的常见做法。

备注:内容来源于stack exchange,提问作者stuart19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:08:10