我正在尝试解决问题,但起初我正在测试rol
指令,而且我完全确定我做的事情非常愚蠢,这使我的测试不正确。
这是一个片段:
li $t0, 101 ## our data
li $t1, 32 ## our loop because we will rotate 32 times later
loop:
## whatever the bit is, just print it or put it inside the asciiz
## and print it later, after we finish rotating,
## so we rotate starting with the first bit,
## and we put it as the first bit lsb
## first we rotate##
rol $t2, $t0, 1 ## rotate and store the new rotated inside $t7
and $t3, $t2, 1 ## now we AND to check our lsb if it one or not
li $v0, 1
move $a0, $t3 ## Print the result of AND
syscall
我基本上要做的是将我的t0
的MSB旋转到LSB,然后将其与1进行AND运算。但是,我得到的是0。
我希望有人可以告诉我我的错误以及如何解决它。
谢谢!
答案 0 :(得分:0)
101
的MSB为零,因此零结果是正确的。如果您加载例如0x80000000
,则会得到1
。请注意rol
是一个伪指令,汇编器将用srl; sll; or
序列替换,因此根据您真正想要做的事情,在适当时使用实际指令可能更有效。例如,在您的情况下,单个srl $t3, $t0, 31
将提供与rol; and
序列相同的结果。
答案 1 :(得分:0)
我在代码中看不到loop
的任何跳转。循环如何运行?
如果loop
标签下面的整个代码是循环内容,那么你是在旋转而不将结果存储到$ t0,所以循环总是返回(101 rol 1) and 1
li $t0, 101 ## our data
## where did you store the new rotated value to $t0? If not, it's always 101
rol $t2, $t0, 1 ## $t2 = $t0 rol 1 = 101 rol 1 = 202
and $t3, $t2, 1 ## $t3 = $t2 and 1 = 202 and 1 = 0