2011-09-08 84 views
0

如果我正在为8位计算机创建指令集,是否可能对某些指令使用2位操作码和某些指令使用3位操作码?当然,每个操作码的值都会有所不同。汇编操作代码问题

我有3种类型的指令,其操作码为00 我有3个i型指令,操作码为01,11和10 然后我可以用操作码100做出指令吗?

+3

如果你正在创建指令集,为什么它不可能?你控制水平,你控制垂直。 –

+0

只要确保没有歧义,例如你不能有两位操作码11和一个三位操作码111(假设其余的位全部用于指定操作数等)。 –

+0

详细阐述你想要做什么。到目前为止你的指令是什么?指示有多大? – Bullets

回答

5

如果您希望您的操作码具有不同的长度,那么您必须确保没有较短的操作码是较长操作码的子字符串。也就是说,如果您有两位操作码01和一个三位操作码010,您的解码器将如何区分?

我假设你正试图将操作码和操作数合并为一个8位数量,并将其视为一条记录。因此,例如,您可能有指令01000111,其中前两位是操作码,后三位是第一个操作数,后三位是第二个操作数。

如果您有两个操作码01010,那么您的解码器如何在这两种解释之间做出决定?

01 000 111 - opcode 01, two three-bit arguments 
010 00 111 - opcode 010, a two-bit argument, and a three-bit argument 

如果您确实需要不同长度的操作码,则需要为较长的操作码保留前缀字符串。因此,您可以使用两位指令00,0110,并且所有更长的指令都以11开头。

+0

因此,如果我有操作码00,01和10,我可以有操作码110吗? – cjw

+1

是的。然后是111或1110和1111或11100,11101,11110,11111等 –

1

看看手臂的拇指指令集,它们会显示一个很好的操作码地图,它以某种方式与您所说的相关。或者在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 

在这一点上,虽然你已经完全消耗掉你的操作码空间的一半,如果你限制自己一个固定的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操作码表格非常精细,从顶部开始,操作码位数更少,操作数位更少,您需要首先选择这些指令,但要明白它们会占用您的大部分操作码空间。那么您的操作数越少操作码越长。

0

当然。其中一个2位指令将成为第三位的转义码。坏消息是它无法在这个范围内扩展你的操作码范围。在4位操作码序列的顺序上更有效,可以跳转到8位或某些...

1

另一个权衡是在状态寄存器中有一个模式位。你一次只有4条指令,但是你可以在内存中写入一个MOV风格的指令(如8086系列)。请参阅65C816(ab?)使用许多模式。