Psv*_*man 3 assembly cpu-architecture low-level
我正在开发一个业余爱好项目,围绕它设计一个小型CPU和一个微型计算机系统.我有一个基本的数据流,并做了一些关于单词大小和ISA中的指令数量的决定.我决定使用一个带有4位操作码字段的16位字.这允许16条指令.
编辑:一些额外的信息
指令字16位格式如下:OOOOPPPPPPPPPPPP
O位是操作码,P位是有效载荷,地址/数据.这允许4096千字节的地址空间和16个操作码.对16个操作码的限制是一个设计决策,使硬件实现更容易.
该架构有一个累加器(A寄存器),一个B寄存器和一个堆栈指针.
/ EndEdit中
ISA具有移动和加载指令(加载/存储),基本算术和逻辑(添加,子,NAND),基本堆栈功能(推送和弹出).还有一个子程序(无条件)跳转/返回指令对.尽管如此,仍然缺少一件:条件跳跃.
返回函数可以与无条件跳转相同,所以我需要的是某种测试和测试条件下的跳转.
所以,这是我的问题:什么是最有用的测试/条件对?
在操作码表中有一个测试和一个条件跳转的空间,或者如果你以某种方式在其他操作中包括条件测试,如ADD或SUB,则有两个条件跳转.
跳过溢出,而不是零,零,携带,不携带是我的一些想法,但我不确定哪一个会更有用.任何建议表示赞赏.
(我已经为汇编程序编写了40多年;实际上在20世纪70年代早期设计并构建了一个生产多寄存器16位机器).真正有用的是CMP指令和指定该条件的JMP相对.
我建议你让算术指令产生状态位
我们称之为"条件位".你会发现它们都很有用.
你的比较指令基本上应该做一个减法,然后把答案扔掉,设置条件位.
您的JMP指令应使用16个操作码之一,3位条件选择器和PC的9位相对偏移量,例如,与PC的跳转相对条件.短相对分支在代码中非常有用.
3位条件选择器应使用两位来选择4个条件中的一个,并使用一位来选择"反转".这样你可以有"jmp zero","jmp not zero"等.
您可以将"跳过无溢出"视为"始终跳跃"; 这些代码非常方便.(我不明白你怎么想"jmp无条件"和"从子程序返回"可以是同一条指令).
从讨论中的评论来看,似乎你没有任何注册.从代码紧凑性(特别是16位指令)和性能(寄存器访问速度总是快于内存)来看,这是一个严重的错误.在操作码命名寄存器后,我会使用2或3或12位.
Aha:在编辑中,OP注意到他有A和B寄存器,可能是由操作码隐式选择的.我设计的机器受PDP-11的启发,但有16个基本操作码和8个寄存器(留下9位"操作数"),它在编码方面确实有所不同.大多数指令将这9位分为寻址模式和偏移:直接(使用第二个字作为地址),立即(第二个字),立即(7位,意味着机器可以轻松处理ASCII文本),间接第二个寄存器自动 - 增量,间接第二个寄存器自动递减,相对于第二个寄存器的短偏移,以及相对于寄存器的第二个字偏移.它没有堆栈,但您可以使用auto-inc/decrement指令轻松实现一个堆栈,这样就不会丢失.很高兴为您编码.(它还具有带陷阱的虚拟内存,以及寄存器集和VM映射之间的硬件上下文切换).
虽然所有这些听起来都需要复杂的逻辑来解码,但事实并非如此.我们设法用~~ 120个所谓的"中等规模"芯片(每个芯片4个门,多路复用器,4位加法器片等)实现这台机器.这些天我希望你能够在一个FPGA中实现整个过程.