首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS中的sll指令是如何工作的?

MIPS中的sll指令是如何工作的?
EN

Stack Overflow用户
提问于 2013-10-04 02:09:55
回答 3查看 4.8K关注 0票数 0

下面的汇编代码在我的课本中给出了。

代码语言:javascript
复制
Loop:
sll $t1, $t0, 2 
add $t2, $a0, $t1
sw $zero, 0($t2)

addi $t0, $t0, 1
slt $t3, $t0, $a1
bne $t3, $zero, Loop

# return where we were
jr $ra

根据这段代码,我有两个问题要问。

第一个问题是关于第二行从顶部。我知道指令sll是移位左逻辑,它向左移动位。由于移位量为2,它将使0000 -> 0100 = 4在十进制。但在第一个循环之后我就不明白了。如果我们把它往左移2,它不是乘以4吗?

第二个问题是,是否可以优化这段代码??在我看来,我可以修改sll并在代码中添加部分,但我不确定。有什么评论吗?

EN

回答 3

Stack Overflow用户

发布于 2013-10-04 02:51:57

左移将插入0,而不是1。那么0000将仍然是0000,0001将在换班后变为0100。

票数 1
EN

Stack Overflow用户

发布于 2013-10-04 09:21:45

有可能优化这段代码吗?

做同样事情的一种更紧凑的方法是:

代码语言:javascript
复制
sll $a1, $a1, 2
addu $a1, $a1, $a0   # $a1 = $a1 * 4 + $a0
Loop:
sw $zero, ($a0)
addiu $a0, $a0, 4
bne $a0, $a1, Loop

我做了这些假设:

  • 循环结束后不再需要$a0$a1的原始值。如果需要,在进入循环之前,将原始值保存在某个地方(在其他寄存器或堆栈中),然后再恢复它们。
  • $t0从零开始。如果不是,则必须在循环之前将$t0 * 4添加到$a0。我还假设退出循环后的$t0值是不相关的。
票数 0
EN

Stack Overflow用户

发布于 2013-10-04 23:46:17

考虑以下二进制文件:

代码语言:javascript
复制
0000 0001

如果您移动1位数字所留下的位,您将得到:

代码语言:javascript
复制
0000 0010

如果再次以1位数向左移动:

代码语言:javascript
复制
0000 0100

又一次:

代码语言:javascript
复制
0000 1000

上面的二进制值等价于1;1x2=2;2x2=4;4x2=8。如果N是要移动的位数,则向左移动的位数乘以2^N。

另一个转移的例子:

代码语言:javascript
复制
Assume $t1 contains 0000 1111

sll $t0, $t1, 3    # $t0 = $t1 * 2^3

Now $t0 contains 0111 1000

您可以通过执行十进制乘法来验证这一点。15 *8= 120。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19172077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档