assembly - MIPS - 按数值移位寄存器值

标签 assembly mips byte-shifting

有人可以向我解释一下吗?问题是:

sll $t2, $t0, 44

目标是求出运算后$t2的值。初始值为:

$t2 = 0x12345678
$t0 = 0xAAAAAAAA

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

t2 = t0 << 44

t0 和 t2 的二进制表示为:

t2 = 10010001101000101011001111000
t0 = 10101010101010101010101010101010

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

最佳答案

有时需要通过第三个寄存器提供的“变量”量来执行移位: sllv $s1,$s2,$s3 #s1 = s2 << s3 使用真正的 MIPS 指令实现新的 sllv 指令。

注意:移位量必须在 0 到 31 之间(含)。因此 $s3 中的值必须以 32 为模减少。这可以通过与 000…0011111 = 0x1F 进行“与”轻松完成。此操作处理 $s3 为正数或负数的两种情况。

sllv $s1,$s2,$s3 # s1 = s2 << s3
add $s1, $s2, $0 # s1 <- s2
add $t0, $s3, $0 # t0 <- s3 (s3 must be preserved)
andi $t0, $t0, 0x1F # take mod 32
beq $t0, $0, EXIT # if t0 == 0, do nothing
addi $t1, $0, 0 # set i == 0 (start from 0)
LOOP:
sll $s1, $s1, 1
addi $t1, $t1, 1 # i=i+1
bne $t1, $t0, LOOP # LOOP while i is still not equal to t0
EXIT:

给你,这就是他们在教科书上的意思,对于 32 位机器,你需要对移位取模 32(如果你想到的话,移位 36 可以解释为移位 4它就像旋转)但他们的意思是取模。

关于assembly - MIPS - 按数值移位寄存器值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22359763/

相关文章:

c++ - Windows/Intel Compiler/Inline Assembler & GNU 语法问题

linux - 与 AT&T 相比,英特尔汇编语法的局限性

c - 调用我在 Win7-x64 上创建的 Detoured 函数后应用程序崩溃

assembly - MIPS中基于指针的阵列访问

prolog - 在 Prolog 中将字节列表转换为整数

assembly - LW 和 LB 结果相同

assembly - MIPS 中分支指令的 NOPS 数

有人可以将这些 C 代码翻译成 mips 汇编代码吗

c - 右移后在 unsigned char 对象上使用按位 AND 运算符是什么意思?