Assembly MIPS Asm:如何将内容推送到堆栈中,以及这对$sp有何影响?

Assembly MIPS Asm:如何将内容推送到堆栈中,以及这对$sp有何影响?,assembly,mips,Assembly,Mips,通过MIPS,我试图了解堆栈是如何工作的。我基本上都记下来了,除了一件事。假设我们有一个宏用于将值推送到堆栈上,如下所示: .macro PUSHI_ %0 li $t0, %0 #loads the value into register $t0 addi $sp, $sp, -4 #increments the stack pointer sw

通过MIPS,我试图了解堆栈是如何工作的。我基本上都记下来了,除了一件事。假设我们有一个宏用于将值推送到堆栈上,如下所示:

.macro PUSHI_    %0

        li      $t0, %0             #loads the value into register $t0                   
        addi    $sp, $sp, -4        #increments the stack pointer
        sw      $t0, ($sp)          #Here is where I need help
.end_macro
我不太明白上面那一行的语法。“sw”用于将寄存器中的值存储到内存中,但在这种情况下,第二个参数发生了什么变化?我以为$sp应该指向堆栈的顶部。它是否将地址存储到$sp中


任何帮助都将不胜感激,谢谢

因此,只需添加一个伪注释(还不能注释),代码中就会有一条先前的指令,其中一个地址被加载到$sp中。 例如,在WinMIPS64中,堆栈位于内存地址1024或0x400*。因此,在程序的前面,您会有这样一个指令:

daddi $sp,  $sp, 0x400 #loads the immediate value 0x400 into the $sp register.
这就是为什么您可以以这种方式将其用作指针。当你说:

sw $t0, ($sp) 
也就是说-将临时寄存器$t0中的值存储在寄存器$sp指向的内存地址中


*这可能是您正在使用的MIPS中的不同地址。从指令的类型来看,您使用的是某种类型的MIPS32版本,但希望您能理解这一点

堆栈位于内存中的地址
$sp
。所以
sw$t0,($sp)
$t0
中的值写入地址
$sp
处的内存,也就是说,它将该项放在堆栈的顶部。堆栈的增长以前是由
addi$sp,$sp,-4
(堆栈向下增长)完成的。@Jester感谢您的帮助。我没有想到你可以把地址作为参数传递到那里。那是用括号表示的吗?因为否则就没有意义了。是的,括号表示间接。在任何情况下,
sw
写入内存,因此
sw$t0,$sp
无效。括号只是一个可视的辅助对象,因此很明显它是一个内存地址。更正常的情况下(至少在操作系统下运行时),您的程序以
$sp
开始,指向可用于堆栈空间的有效内存块的顶部。顺便说一句,SO上的大多数MIPS问题都使用带有32位MIPS代码的MARS或SPIM模拟器。请注意,MIPS32实际上是MIPS ISA的一个特定版本,而不仅仅意味着32位MIPS。-MIPS32是MIPS V的32位子集,删除了所有64位指令。与x86不同,MIPS不区分32位模式和64位模式,但有些代码选择不使用64位模式