Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly la和addi之间的差异,用于在MIPS asm中复制寄存器_Assembly_Mips - Fatal编程技术网

Assembly la和addi之间的差异,用于在MIPS asm中复制寄存器

Assembly la和addi之间的差异,用于在MIPS asm中复制寄存器,assembly,mips,Assembly,Mips,我是MIPS新手,对一个概念感到困惑 我在$s5中存储了一个值5,我想将它复制到$a0,以便我可以使用li$v0,1打印它。我有两种复制方法 addi$a0,$s5,0 la$a0,0($s5) 要么1。或2。如果我在后面打印值5,则可以打印值li$v0,1/syscall) 但是为什么它对2有效呢。?2.正在将$s5的地址存储在$a0处,但我们需要一个值,而不是地址 这将由print_integer自动处理吗?首先,la不是MIPS硬件指令,只是由汇编程序实现的伪指令,如li。(通常使用lui

我是MIPS新手,对一个概念感到困惑

我在
$s5
中存储了一个值
5
,我想将它复制到
$a0
,以便我可以使用
li$v0,1
打印它。我有两种复制方法

  • addi$a0,$s5,0
  • la$a0,0($s5)
  • 要么1。或2。如果我在后面打印值
    5
    ,则可以打印值
    li$v0,1
    /
    syscall

    但是为什么它对2有效呢。?2.正在将
    $s5
    的地址存储在
    $a0
    处,但我们需要一个值,而不是地址


    这将由print_integer自动处理吗?

    首先,
    la
    不是MIPS硬件指令,只是由汇编程序实现的伪指令,如
    li
    。(通常使用
    lui
    /
    addiu
    在寄存器中构造32位符号地址,如果您以正常方式使用它,如
    la$reg,symbol
    )。查看反汇编/机器代码输出,例如,组装时MARS向您展示

    通过使用寄存器寻址模式而不是符号名,可以将
    la
    滥用为
    move
    。(
    move
    是另一条伪指令;MIPS没有硬件移动,您只需添加
    $zero
    或立即
    0

    如果汇编器选择了
    la
    ,则
    la
    可以准确地组装成
    addi$a0,$s5,0
    。(虽然更可能的情况是,它会选择addiu;如果立即数不是0,则不必在签名溢出时捕获。通常,您永远不需要add/addi,只需要addu/addiu。)

    2将$s5的地址存储为$a0,但我们需要一个值,而不是地址。 这将由print_integer自动处理吗

    不,无论哪种方式,
    $a0
    中的值都是相同的,就像您像普通人一样移动$a0,$s5一样。所以print_integer排序的最终结果没有差别

    你不能记下登记簿的地址。寄存器可以保存内存地址,但不能获取寄存器的地址

    la
    “获取其源操作数的地址”,但请注意
    0($s5)
    不是寄存器,而是内存寻址模式的语法,它引用
    $s5
    中地址处的内存,就像您可以与
    lw
    一起使用一样。该内存的地址正好是
    $s5

    C等价物为
    int*a0=&*s5其中&取消一元
    *
    取消引用