0

我试图解决一个问题,但起初我正在测试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

我基本上想要做的是将我的 MSB 旋转t0到 LSB,然后与 1 进行与运算。但是,我得到的始终是 0。

我希望有人能告诉我我的错误以及如何解决它。

4

2 回答 2

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
于 2013-10-28T01:26:07.243 回答
0

当以 32 位表示时的 MSB101为零,因此零结果是正确的。例如,如果您加载,0x80000000您将得到1结果。请注意,这rol是一个伪指令,汇编器将用srl; sll; or序列替换,因此根据您真正想要做的事情,酌情使用真实指令可能会更有效。例如,在您的情况下,单个将给出与序列srl $t3, $t0, 31相同的结果。rol; and

于 2013-10-27T23:23:04.823 回答