2016-11-27 96 views
0

我目前正在做一个作业分配,它将一个位值(0x0或0x1)插入到第n个位置。MIPS程序集没有正确移动

.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,这使整个事情变得糟糕。我不知道我的宏的逻辑是错误的还是我测试宏的方式是错误的,所以它搞砸了我的输出?

+0

1左移两次是4,或者说到0x101你得到0x105。问题是什么? –

+0

@SamiKuhmonen我想我只是想通了,而不是将2传入$ t1,我应该将4传入$ t1。我只是想知道这个宏的逻辑是正确的吗? – user21478621

回答

1

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

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

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

这就是宏的重点:减少重复步骤的次数。

+0

非常感谢你! – user21478621