我正在从事一个业余项目,设计一个小型CPU和一个微型计算机系统。我有一个基本的数据流,并对ISA中的字大小和指令数量做出了一些决定。我已经决定了一个16位的字和一个4位的操作码字段。这允许16条指令。
编辑:一些附加信息
指令字16位,格式如下: OOOOPPPPPPPPPPPP
O位是操作码,P位是有效载荷、地址/数据.这允许4096千字的地址空间和16个操作码。对16个操作码的限制是一个使硬件实现更容易的设计决策。
该体系结构有一个累加器(A寄存器)、一个B寄存器和一个堆栈指针.
/ENDEDIT
ISA有移动和加载指令( load /存储)、基本算法和逻辑(add、sub、NAND)、基本堆栈函数(push和pop)。还有一个子程序(无条件的)跳转/返回对指令。尽管如此,仍然缺少一个部分:条件跳转。
返回函数可以与无条件跳转相同,所以我需要的是某种测试,以及测试条件下的跳转。
所以,下面是我的问题:最有用的测试/条件对是什么?
在操作码表中有一个测试和一个条件跳转的空间,或者两个条件跳转,如果您在其他操作中包括条件测试,比如ADD或SUB。
跳进溢出,而不是零,零,携带,不携带是我的一些想法,但我不确定哪一个会更有用。如有任何建议,敬请见谅。
发布于 2016-02-18 14:53:01
(我多年来一直在为汇编程序编写代码;早在20世纪70年代初,我就设计并建造了一台生产多寄存器16位机器)。真正有用的是CMP指令,以及指定该条件的JMP相对程序。
我建议你让算术指令产生状态位
我们称之为“条件位”。你会发现它们都很有用。
您的比较指令基本上应该做一个减法,并扔掉答案,设置条件位。
您的JMP指令应该使用16种操作码中的一种,一个3位条件选择器,以及一个与PC相对偏移的9位相对偏移,例如,一个相对于PC的跳转条件。短的相对分支在代码中非常有用。
3位条件选择器应使用两位来选择4种条件中的一种,并使用一位选择“反转”。这样你就可以有"jmp零“,"jmp而不是零”等等。
您可以将“跳转不溢出”视为“始终跳转”;这在代码中非常方便。(我不明白你怎么会认为"jmp无条件“和”从子例程中返回“可以是相同的指令)。
从讨论中的评论来看,你似乎没有任何寄存器。从代码紧凑的角度来看,这是一个严重的错误(尤指代码紧凑性)。使用16位指令),性能(寄存器访问速度总是快于内存)。我会用2或3或在操作码之后剩下的12位来命名寄存器。
Aha:在编辑中,他有A和B寄存器,可能是由操作码隐式选择的。我设计的机器是受PDP-11的启发,但有16个基本操作码和8个寄存器(留下9位“操作数”),它在编码方面确实起了作用。大多数指令将这9位分解为寻址模式和偏移:直接(使用第二个字作为地址)、直接(第二个字)、立即(7位,意味着机器可以轻松地处理ASCII文本)、间接第二寄存器自动增量、间接第二寄存器自动递减、相对于第二个寄存器的短偏移和相对于寄存器的第二个字偏移。它没有堆栈,但是您可以使用auto/减量指令来实现一个,这样就不会有损失。这是一种很荣幸的编码。(它还具有带有陷阱的虚拟内存,以及寄存器集和VM映射之间的硬件上下文切换)。
虽然所有这一切听起来都需要复杂的逻辑来解码,但事实并非如此。我们用大约120片所谓的“中等规模”芯片(每片4门、多路复用器、4位加法器片等)实现了这台机器。现在,我希望您能够在一个FPGA中实现整个过程。
发布于 2016-02-18 15:28:31
还有两个操作码,一个测试和一个条件跳转指令,就像你建议的那样是个好主意。
如果要保持4/12操作数/操作数格式,可以将条件放在测试中,如果测试结果为真,则让JMP指令跳转。然后,您将有一个12位字段来选择测试类型。在这个领域你可以编码任何你想要的:A is 0,A is not 0,A > 0,A < B,A + B overflow .注意,复杂的比较变得有点尴尬,因为它们意味着测试可以执行比任何其他指令更复杂的操作,但是整个简单的比较仍然是有意义的。
例子:
LOAD_A [0x30]
LOAD_B [0x40]
TEST (SIGNED A < B)
JIF MY_ADDRESS跳跃可以是绝对12位或相对12位.许多简单的ISA实现相对地址,因为它们更小,但是绝对地址更容易组装(如果您手工编写程序,那么每次更改程序时都不太可能更改地址)。
https://stackoverflow.com/questions/35483152
复制相似问题