如果我要为8位计算机创建指令集,我是否可以使用2位操作码和一些带3位操作码的指令进行操作?当然,每个操作码的值都是不同的。
我有3个r类型的指令,其操作码为00 我有3个i类型指令,操作码为01,11和10 我可以用op代码100进行指令吗?
答案 0 :(得分:5)
如果您希望您的操作码具有不同的长度,那么您必须确保没有较短的操作码是较长操作码的子串。也就是说,如果您有两位操作码01
和三位操作码010
,那么您的解码器将如何区分它?
我假设您正在尝试将操作码和操作数拟合为单个8位数量并将其视为记录。因此,例如,您可能有指令01000111
,前两位是操作码,后三位是第一个操作数,后三位是第二个操作数。
如果您有两个操作码,01
和010
,您的解码器如何决定这两种解释?
01 000 111 - opcode 01, two three-bit arguments
010 00 111 - opcode 010, a two-bit argument, and a three-bit argument
如果您确实需要不同长度的操作码,则需要为较长的操作码保留前缀字符串。因此,您可以使用两位指令00
,01
和10
,所有较长的指令都以11
开头。
答案 1 :(得分:1)
从arm看看拇指指令集,它们显示了一个很好的操作码映射,它与你说的有些相关。或者在github上寻找lsasim,在那里我发明了自己的指令集,有些指令只需要4位操作码来确定指令是什么需要8。
我假设您在询问8位指令?正如汤姆所说,你控制水平,你可以控制垂直,你可以随心所欲。您不会从两位opcides中获得太多,也许您只有两个支持这些操作码的寄存器,例如:
00riiiii store pc relative, r = 0 means register r0, r = 1 means register r1 iiiii is sign extended and added to the program counter for the store address
01riiiii load pc relative
此时虽然您已经完全消耗了操作码空间的HALF,但是如果您将自己限制为固定的8位指令集。你没有说明你在做什么。继续我的想法所有的0xxxxxxx操作码现在消耗了你必须用1开始其余的
1000ssddd move rd to rs (assumes rs = r0 to r3 and rd = r0 to r7
1001ssddd move rs to rd
1010ssddd add rs=rs+rd
1011ssddd sub rs=rs-rd
等
你可以弥补你想要的任何东西。关键是它必须是你可以解码的东西,这是有效的
100ss0dd some operation
100ss1dd another operation
但这不会:
100ss0dd some operation
100ss1dd another operation
10iiiiii branch to pc plus sign extended immediate
因为你不能唯一地解码来自其他两个的第三条指令,当你看到10xxxxxx它是一个分支?如果第2位为0,则第2位为1,则不是。
在这方面很好地绘制了arm / thumb操作码表,从顶部开始,你有更少的操作码位和更多操作数位的指令,你需要先选择那些,但要了解它们使用了大部分的操作码空间。然后你有更长的操作码和更少的操作数。
答案 2 :(得分:1)
另一种权衡是在状态寄存器中有一个模式位。您一次只有4条指令,但您可以使用MOV样式(如8086系列)指令在内存中写入该位置。有关(ab?)使用多种模式的信息,请参见65C816。
答案 3 :(得分:0)
不确定。你的一个2位指令将是第3位的转义码。坏消息是它无法在这个规模上大大扩展您的操作码范围。更有效的4位操作码系列,可以逃脱到8位或某些......