【问题标题】:Byte Manipulation for MIPS instruction setMIPS 指令集的字节操作
【发布时间】:2013-11-28 06:55:26
【问题描述】:

我想使用 MIPS 指令集进行一些字节操作。

  • 我有注册$S00x8C2E5F1E 和注册$S10x10AC32BB
  • 我想将$S0的第二个字节5F存入$S1的第三个字节AC

我的逻辑是将寄存器$S0 的字节存储到另一个寄存器中,将其转移到所需的字节。然后我会用0xFF00FFFF注册$S1。最后,我将只是或两个寄存器。 听上去怎么样?这是正确的吗?有更好的办法吗?

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

【问题讨论】:

    标签: assembly mips computer-architecture instruction-set digital-logic


    【解决方案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;
    

    【讨论】:

    • 我一直在寻找很好的准确答案,因为我不知道存在这样的指令。但是,您的指令有四个操作数?!那么它考虑哪种格式?第 2 版是否也添加了新格式?另外,Paul,如果您可能知道,所有版本之间的简要区别是什么,我现在知道它们最多可以发布 5 版。
    • @user2994448 格式有标准的 6 位主操作码,然后是源寄存器 [rs],然后是目标寄存器 [rt](也是源),然后是两个 5 位立即数字段,然后是 6 位次要操作码;所以它类似于 SRA 的格式,将第三操作码 [位 25:21] 替换为 rs,并将 rd 字段替换为 5 位立即数,或者类似于 SRAV 的格式,将第三操作码 [位 10:6] 替换为5 位立即数,rd 字段被立即数替换。
    • @user2994448 关于 MIPS ISA 的不同发行版/版本,这本身可能是一个不错的问题(不确定 StackOverflow 是否适合提出这样的问题)。 R5 添加了硬件页表遍历,并从应用程序特定扩展中区分了模块(使用基本架构许可。--多线程和 DSP ASE 成为模块,添加了 SIMD 和 Virt。)。没有 R4,R3 包括 microMIPS 可变长度编码。我认为微控制器 ASE 出现在 R3 中,但手册的修订版 1.01 的日期为 2011 年 3 月 21 日。在 R2 之前,有 MIPS I、II、III 和 IV (IV==R2?? )。
    【解决方案2】:

    考虑以下几点:

    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
    

    【讨论】:

    • 我知道。我在问这是否是用于字节操作的正确逻辑,或者有更短的方法,例如移动字节或其他东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2013-07-26
    相关资源
    最近更新 更多