【问题标题】:MIPS stack pointerMIPS 堆栈指针
【发布时间】:2015-05-22 06:28:22
【问题描述】:

在这里感觉有点傻,试图弄清楚这条线在做什么:

addiu   sp,sp,-24

我知道它正在设置堆栈指针,我的困惑是addiu 部分。它将 UNSIGNED -24 添加到堆栈指针中,并将其存储回堆栈指针中。

sp 是采用 16 位的值 -24(FFE8)(addiu 操作的“立即”值是 16 位宽)还是将符号扩展到完整的 32 位?

另外,sp=0 是在这条指令之前吗?它是一段琐碎的 c 代码中的第一条指令。

我正在将 MIPS 内核作为个人项目来实现,这让我有点难过。

【问题讨论】:

    标签: c mips


    【解决方案1】:

    addiu 指令包含一个 16 位立即数操作数。当 ALU 执行指令时,立即操作数被符号扩展为 32 位。如果加法过程中发生补码溢出,则忽略。

    addiu   d,s,const        # $d <—— s + const. 
                             # Const is 16-bit two's comp. sign-extended to 32 bits
                             # when the addition is done. No overflow trap.
    

    【讨论】:

    • 完美,谢谢。看起来你在这里引用一个文件,你有链接吗?我正在使用的是:cs.cornell.edu/courses/cs3410/2015sp/MIPS_Vol2.pdf
    • @ZackNewsham 它来自我前段时间参加的课程的一些幻灯片。也许是从您链接的 pdf 中推断出来的。
    【解决方案2】:

    算术说明

    MIPS 支持四种基本算术运算:加法、减法、乘法和 分工。

    加法说明:基本加法说明

     add Rdest,Rsrc1,Rsrc2
    

    Rsrc1Rsrc2 的内容相加,并将结果存储在Rdest 中。这些数字被视为有符号整数。如果发生溢出,则会产生溢出异常。如果不需要溢出异常,可以使用addu

    第二个操作数可以指定为immediate 16-bit number。格式为:

     addi Rdest,Rsrc1,imm
    

    16-bit 的值为 sign-extended to 32 bits,并添加到 Rsrc1 的内容中。与 add 指令一样,会产生溢出异常。如添加,如果不需要溢出异常,我们可以使用addiu

    堆栈实现

    MIPS 不明确支持堆栈操作。相比之下,它 提供push、pop等指令,方便堆栈操作。此外,还有一个特殊的堆栈指针寄存器sp,用于保存栈顶信息。在 MIPS 中,寄存器起到堆栈指针的作用。我们必须操作这个寄存器来实现堆栈。

    例如,堆栈向下增长(即,当我们将项目压入堆栈时,地址减少)。因此,当在堆栈上为压入值保留空间时,我们必须减小sp 的值。因此,堆栈指针在执行开始时的相对值可以取为零。

    例如,要推送寄存器a0ra,我们必须预留8字节的堆栈空间,并使用sw来推送值,如下所示:

    sub $sp,$sp,8 # reserve 8 bytes of stack
    sw $a0,0($sp) # save registers
    sw $ra,4($sp)
    

    此序列通常在程序开始时使用以保存寄存器。要在从程序返回之前恢复这些寄存器,我们可以使用以下序列:

    lw $a0,0($sp) # restore the two registers
    lw $ra,4($sp)
    addu $sp,$sp,8 # clear 8 bytes of stack
    

    那么,第一个问题的答案:

    16-bit 的值为sign-extended to 32 bits,并添加到Rsrc1 的内容中。

    关于你的第二个问题:

    因此,堆栈指针在执行开始时的相对值可以取为零。

    【讨论】:

    • 感谢您的回答,但它似乎针对addi 而不是addiu 我知道该标志在addi 中扩展是有道理的。我的问题是它如何影响addiu
    • @Zack Newsham 不客气 :),addiuaddi 的一个特例,不需要溢出异常并且应用相同的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多