使用 MIPS 32 汇编语言,如何使用 addu 和 ori 命令加载和添加 4 个整数?

问题描述

这就是我所拥有的,但是它不想做最后一个 addu,它试图将寄存器 10 和 13 加在一起到寄存器 14 中。最后一个 addu 命令将字母“e”放入寄存器 14。

        .text
        .globl  main

main:
        ori     $8,$0,0x2       # put two's comp. two into register 8
        ori     $9,0x3       # put two's comp. three into register 9
        ori     $11,0x4      # put two's comp. four into register 11
        ori     $12,0x5      # put two's comp. five into register 12
        addu    $10,$8,$9       # add register 8 and 9,put result in 10
        addu    $13,$11,$12     # add register 11 and 12,put result in 13
        addu    $14,$10,$13     # add register 10 and 13,put result in 14

## End of file

解决方法

它是十六进制 E,又名 0xe,又名 14(dec),而不是字母“e”。

您正在查看以十六进制显示内容的调试器。这不是“输出”,而是由调试器完成的对寄存器中值的解释。调试器具有以二进制、十六进制或十进制显示寄存器的模式——使用 QtSpim 菜单项“寄存器”。 bugger 并不知道你想显示什么,但它可以将所有显示的寄存器从二进制切换到十六进制再到十进制。

无论调试器选择何种显示形式,寄存器中保存的实际值都是相同的。虽然硬件使用二进制来存储寄存器值,但存储在寄存器中的值只是一个数字,无论我们如何显示——并且要清楚数字的任何字符序列(如 100)是使用数字的显示格式根据。寄存器不知道显示格式和数字基数,它们只是使用二进制存储数字——这是调试器解释数字基数中的数字以进行显示。他们使用二进制仅意味着他们不能存储大于 32 位的数字,但在其他情况下存储 100 十进制或十六进制 64 在寄存器中都是相同的数字(完全相同的位模式)。

如果您想要实际输出,您需要一个指令序列将数字打印为字符序列,使用某种系统调用——加载一个值以显示到 $a0 中,并使用系统调用 #1 以十进制打印。我不知道 QtSpim 中的打印十六进制,但 MARS(它在 MIPS 模拟领域的表亲)有系统调用 #34 来打印十六进制。