如果我正在为一台8位计算机创建一个指令集,是否有可能有一些具有2位操作码的指令和一些具有3位操作码的指令?当然,每个操作码的值将是不同的。
我有3个r类型的指令,它们的操作码是00。我有3个i类型的指令,它们的操作码是01、11和10,然后我可以用操作码100来执行指令吗?
发布于 2011-09-09 06:57:21
如果您希望您的操作码具有不同的长度,那么您必须确保没有较短的操作码是较长操作码的子串。也就是说,如果你有2位操作码01
和3位操作码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
开头。
发布于 2011-09-09 09:08:11
看看来自arm的thumb指令集,它们显示了一个很好的操作码映射,在某种程度上与您所说的内容相关。或者在github上查找lsasim,在那里我发明了自己的指令集,一些指令只需要四位操作码就能找出一些指令需要什么8。
我想你是在问8位指令吧?正如Tom所说,你控制水平方向,你控制垂直方向,你可以做任何你想做的事情。你不会从两位操作码中得到太多,也许你只有两个支持这些操作码的寄存器,例如:
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
但是,如果您将自己限制为固定的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操作码表在这方面画得非常好,从顶部开始,你有更少的操作码位和更多的操作数位的指令,你需要首先选择这些指令,但要知道它们占用了你的操作码空间的很大一部分。那么你就有了更长的操作码和更少的操作数。
发布于 2016-04-27 09:51:35
另一种折衷方案是在状态寄存器中设置一个模式位。您一次只有4条指令,但是您可以使用MOV样式(如8086系列)指令写入内存中的该位置。请参阅65C816了解具有多种模式的(ab?)用途。
https://stackoverflow.com/questions/7355099
复制相似问题