我正在学习MIPS 32位。我想问一下,为什么我们在将Word数据发送到ALU之前将16位偏移量(在单周期数据路径中)扩展?为什么我们在加载字符指令中扩展?
回答
16位偏移量的声音是有符号的2's complement数字,即它可以是正数也可以是负数。
将其转换为32位时,需要将最高有效位复制到高16位以保留符号信息。
我不确定它现在对您有帮助,但我仍然会发布它。让我们从一个非常一般的意义上考虑一下C++中的指令数组,即A [0],A [1],A [2] ..... 任何两条指令之间的“比喻”距离是1 UNIT。
让我们来比喻MIPS。在MIPS中,象征性地,每个指令由“1个单元”分隔,然而,1个单元= 4个MIPS中的字节。每条指令的长度都是4字节,这就是为什么当从指令转到指令时,PC增加4即PC + 4。这样,指令i和指令i + 2之间的差距就是“比喻性”2但实际上是2 * 4 = 8即PC + 4 + 4回到在分支指令中指定的偏移量,偏移量代表与下一条指令(分支之后的指令)之间的“比喻性”距离。因此,要获得“实际”距离,偏移量应乘以4.这就是我们被指示将偏移量“签名扩展”到“左”的原因的原因,因为左移任何二进制值n位导致该值乘以2^n。在我们的例子中,2^2 = 4
所以分支指令的实际目标地址是PC + 4 + 4 * Offset。
希望这会有所帮助。
据我所知,在加载或存储指令中,偏移值被添加到临时寄存器中的值,作为临时值。寄存器是32位,16位和32位的加法操作是不可能的,该值是符号扩展的。
我认为你在这里让你的概念有点不对。
您认为进入ALU的5位实际上进入寄存器存储器中以选择32 [2^5]个寄存器之一。
每个寄存器本身是32位的。因此,要将偏移量添加到寄存器值,您需要将其扩展到32位。
ALU操作始终在MIPS的单周期数据路径中具有相同大小的两个寄存器之间。
在32位机器的硬件中,大多数ALU采用32位输入,所有寄存器都是32位寄存器。
要处理您的数据,它必须是32位宽,这就是为什么我们需要SIGN-extend,但是另一种方法是零扩展,但是在处理立即数和偏移量时要使用SIGN-extend来保存2的补码。
符号扩展发生在例如在M68xxx机器的情况下仅在加载地址寄存器的情况下。在数据寄存器的情况下不是这样。
例如,
movea.w addr,a0
move addr,d0
addr:
dc.w $FFFF
导致数据的情况下,寄存器加载到$ 0000FFFF,然而,在 地址寄存器加载到$ FFFFFFFF的情况。
为了理解这一点,构建两个互补的签名为负的 演示文稿$ FFFF,将数字扩展为32位并重做两个补充,在32位中找到相应的表示形式。
欢呼和亲切的问候, 斯蒂芬S.
- 1. 我没有看到在php.ini中的扩展指令,但扩展加载
- 2. 为什么PHP不加载SQLite扩展?
- 3. 为什么我们在扩展方法中使用“this”?
- 4. 为什么我的WCF DataService不加载扩展属性?
- 5. 为什么我们要加载这么多的字体格式?
- 6. AngularJS - 为什么我的指令/控制器只加载一次?
- 7. 为什么我们不能在角2指令
- 8. 为什么我们使用扩展应用程序
- 9. 我怎么添加字符串扩展将字符串转换为UTF8
- 10. 创建通用扩展方法时,我们正在扩展什么?
- 11. JasperReport加载字体扩展
- 12. 为什么此C字符串宏在扩展时会损坏?
- 13. 为什么django在扩展后生成空字符串?
- 14. 为什么我们必须在扩展的PersistenceContext中手动刷新()EntityManager?
- 15. 什么是扩展方法,为什么我们需要使用它?
- 16. 我为什么要扩展java.lang.RuntimeException
- 17. 为什么%(Identity)扩展为空字符串?
- 18. 使用字符串参数在Codeigniter中加载扩展库
- 19. 为什么我们不能把指针指向一个字符串?
- 20. 为什么我们用'?'在c中的字符#
- 21. 为什么64位MSBuild加载32位扩展?
- 22. 为什么这个Chrome扩展会加载两次?
- 23. PHP扩展加载在命令行(cli)但未加载apache
- 24. C++为什么我需要在扩展类中指定函数的作用域?
- 25. 为什么顶部布局指南在我的iMessage扩展中移动
- 26. GNU as .macro指令扩展
- 27. 是什么_GNU_,_attribute_和编译扩展和指令
- 28. 什么是扩展angularjs指令功能的最佳方式?
- 29. .ac扩展名指的是什么?
- 30. 为什么我们有这么多种装配加载方法?
我的意思是,为什么我们需要将其转换为32位?进入ALU的另一个寄存器(基址寄存器)不是32位,而是5位。为什么这需要32位? –
基址寄存器的内容是32位,这就是真正进入ALU的内容。 – jpa