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_int
和exit
是另外两个小宏
我得到的结果是261,换算成16进制后是00000105。当我调试它时,我注意到当谈到第一个班次时,00000001 和左移 2 变成 00000005,这把整个事情搞砸了。我想知道是我的宏逻辑有误还是我测试宏的方式有误导致我的输出乱七八糟?
根据上下文,您的宏是正确的。
但是,maskReg
需要一个。您在 宏之外预设了这个。而且,您正在使用 la
来初始化常量值。 li
将是更常见的选择。
我会删除 la $t3,1
并添加 li $maskReg,1
作为宏的第一行。
这就是宏的全部意义所在:减少重复步骤的数量。
我目前正在做作业,将一个位值(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_int
和exit
是另外两个小宏
我得到的结果是261,换算成16进制后是00000105。当我调试它时,我注意到当谈到第一个班次时,00000001 和左移 2 变成 00000005,这把整个事情搞砸了。我想知道是我的宏逻辑有误还是我测试宏的方式有误导致我的输出乱七八糟?
根据上下文,您的宏是正确的。
但是,maskReg
需要一个。您在 宏之外预设了这个。而且,您正在使用 la
来初始化常量值。 li
将是更常见的选择。
我会删除 la $t3,1
并添加 li $maskReg,1
作为宏的第一行。
这就是宏的全部意义所在:减少重复步骤的数量。