繁体   English   中英

MIPS组件无法正确移动

[英]MIPS assembly not shifting correctly

我目前正在做作业,将位值(0x0或0x1)插入第n个位置。

.macro insert_to_nth_bit($regD, $regS, $regT, $maskReg)
    # regD:    bit pattern in which to be inserted at nth position
    # regS:    position n ( 0-31)
    # regT:    the bit to insert ( 0x0 or 0x1)
    # maskReg: temporary mask
                                    # Let's say regD = 00000101
    sllv $maskReg, $maskReg, $regS  # Let's say regS = 2, the second position at regD(0)
                                    # maskReg = 00000010 after shifting
    not $maskReg, $maskReg          # maskReg = 11111101
    and $regD, $regD, $maskReg      # regD = 00000101
    sllv $regT, $regT, $regS        # regT = 00000001, we want to insert 1 into the 2nd position at regD
                                    # regT = 00000010 after shifting
    or $regD, $regD, $regT          # 00000101 OR 00000010 = 00000111. The bit is what i wanted 
.end_macro

这是我编写的用于测试的宏

.text
.globl main
la  $t0, 0x00000101 #t0 = 00000101
la  $t1, 2      # nth position = 2
la  $t2, 0x1    # insert 0x1
la  $t3, 1      # maskReg = 00000001
insert_to_nth_bit($t0, $t1, $t2, $t3)
print_int($t0)
exit

print_intexit是另外两个小宏

我得到的结果是261,即转换为十六进制后的结果是00000105。 当我调试它时,我注意到当涉及到第一个移位时,00000001和左移2变为00000005,这使整个事情变得混乱了。 我想知道宏的逻辑是否错误,或者我测试宏的方式是否错误,从而弄乱了我的输出?

根据上下文,您的宏是正确的。

但是, maskReg需要一个。 您正在宏外部进行预设。 并且,您正在使用la初始化常量值。 li将是更常见的选择。

我将删除la $t3,1并添加li $maskReg,1作为宏的第一行。

这就是宏的全部要点:减少重复步骤的数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM