装配操作码问题

时间:2011-09-08 22:06:01

标签: assembly

如果我要为8位计算机创建指令集,我是否可以使用2位操作码和一些带3位操作码的指令进行操作?当然,每个操作码的值都是不同的。

我有3个r类型的指令,其操作码为00 我有3个i类型指令,操作码为01,11和10 我可以用op代码100进行指令吗?

4 个答案:

答案 0 :(得分: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

如果您确实需要不同长度的操作码,则需要为较长的操作码保留前缀字符串。因此,您可以使用两位指令000110,所有较长的指令都以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位或某些......