MIPS - 按数值移位寄存器值

use*_*403 5 assembly mips byte-shifting

谁可以给我解释一下这个?问题是:

sll $t2, $t0, 44
Run Code Online (Sandbox Code Playgroud)

目标是在操作后找到 $t2 的值。初始值为:

$t2 = 0x12345678
$t0 = 0xAAAAAAAA
Run Code Online (Sandbox Code Playgroud)

我知道“sll $t2, $t0, 44”的伪代码翻译是:

t2 = t0 << 44
Run Code Online (Sandbox Code Playgroud)

并且 t0 和 t2 的二进制表示是:

t2 = 10010001101000101011001111000
t0 = 10101010101010101010101010101010
Run Code Online (Sandbox Code Playgroud)

但是如何移位 44 位呢?我认为开始时一个值只有 32 位。如何通过将 $t0 移动 44 位来找到 $t2 的值?

Sta*_*yer 1

有时需要执行通过第三个寄存器提供的 \xe2\x80\x98variable\xe2\x80\x99 数量的移位:\nsllv $s1,$s2,$s3 #s1 = s2 << s3\n实现新的sllv指令使用真正的MIPS指令。

\n\n

注意:移位量必须在 0 到 31 之间(含)。因此 $s3 中的值必须减少模 32。这可以通过 \xe2\x80\x98anding\xe2\x80\x99 和 000\xe2\x80\xa60011111 = 0x1F 轻松完成。此操作处理 $s3 为正或负的两种情况。

\n\n
sllv $s1,$s2,$s3 # s1 = s2 << s3\nadd $s1, $s2, $0 # s1 <- s2\nadd $t0, $s3, $0 # t0 <- s3 (s3 must be preserved)\nandi $t0, $t0, 0x1F # take mod 32\nbeq $t0, $0, EXIT # if t0 == 0, do nothing\naddi $t1, $0, 0 # set i == 0 (start from 0)\nLOOP:\nsll $s1, $s1, 1\naddi $t1, $t1, 1 # i=i+1\nbne $t1, $t0, LOOP # LOOP while i is still not equal to t0\nEXIT:\n
Run Code Online (Sandbox Code Playgroud)\n\n

给你,这就是他们在教科书中的意思,对于 32 位机器,您需要对移位取模 32(如果您将其视为移位 4,则移位 36 可以解释为移位 4)旋转),但它们的意思是取模。

\n