1

我想用MIPS指令集做一些字节操作。MIPS指令集的字节操作

  • 我有注册$S0具有0x8C2E5F1E并注册$S1具有0x10AC32BB
  • 我想将$S0,5F的第二个字节存储到$S1,AC的第三个字节中。

我的逻辑是将寄存器$S0的字节存储到另一个寄存器,将其移位到所需的字节。然后,我会与0xFF00FFFF注册$S1。最后,我只是或两个寄存器。 听起来怎么样?这是对的吗?有更好的方法吗?

任何建议或解决方案,将不胜感激。

回答

1

对于版本2和以后,MIPS包括插入位字段指示这需要位从一个寄存器开始于至少显著,并将它们放置到指定的范围中的第二寄存器。因此,您的字节插入可以执行以下操作:

// rotating right one byte rather than shift to preserve data 
// without using an additional register 
ROTR $S0, $S0, 8; 
// insert LSbits from $S0 into $S1 starting at bit 16 
// with size of 8 bits 
INS $S1, $S0, 16, 8; 
+0

我在寻找的确实很好的答案,因为我不知道这样的说明存在。但是,你的指令有四个操作数?!那么考虑哪种格式呢?版本2是否添加新格式?另外,如果你知道,保罗,所有版本之间有什么短暂的区别,我现在知道他们到了我认为的第5版。 – Salchem

+0

@ user2994448该格式具有标准的6位主操作码,然后是源寄存器[rs],然后是目标寄存器[rt](也是源),然后是两个5位立即字段,然后是6位次操作码;所以它与第三操作码[位25:21]替换为rs并且rd字段替换为5位立即数的SRA格式类似,或者与第三操作码[位10:6]替换为SRAV的格式一个5位立即数和rd字段被一个立即数替换。 –

+0

@ user2994448就MIPS ISA的不同版本而言,这可能是一个体面的问题(不知道StackOverflow是否适合这样的问题)。 R5增加了硬件页表行走功能,并区分了模块(基础架构授权 - 多线程和DSP ASE成为模块,添加了SIMD和Virt。)来自Application Specific Extensions。没有R4,R3包含microMIPS可变长度编码。我认为*微控制器ASE进入R3,但本手册的1.01版本的日期是2011年3月21日。在R2之前有MIPS I,II,III和IV(IV == R2 ??)。 –

1

考虑以下几点:

ori $t0 $s0 0xFF00 #extract byte 2 
sll $t0 $t0 8 #shift to third byte 

#create mask to clear third byte 
lui $t1 0xFF 
not $t1 $t1 

and $s1 $s1 $t1 #clear third byte 
or $s1 $s1 $t0 #set third byte 
+0

我知道这一点。我在问这是否是用于字节操作的正确逻辑,或者是否有一种更短的方式,如移动字节或其他。 – Salchem