gpt4 book ai didi

assembly - 汇编中main函数开头的栈内存操作

转载 作者:行者123 更新时间:2023-12-04 20:26:40 26 4
gpt4 key购买 nike

我把一个很简单的C程序转成汇编文件(这里是RISC-V ISA),在堆栈指针上做了一些我不明白的操作。

C程序:

int main()
{
int a = 10;
return 0;
}

相关的汇编代码:
        .file   "alternating_branches_2.c"
.option nopic
.text
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-32
sd s0,24(sp)
addi s0,sp,32
li a5,10
sw a5,-20(s0)
li a5,0
mv a0,a5
ld s0,24(sp)
addi sp,sp,32
jr ra
.size main, .-main
.ident "GCC: (GNU) 8.3.0"

这是我的理解。

sp 包含堆栈内存的最后一个地址。因此,压入堆栈会降低 sp 的值。
s0 是帧指针,指向 sp 的前一个值。

在第一行中,从堆栈指针开始减少 32 的偏移量。这是要创建堆栈帧吗?通常,在堆栈中,推送操作会减少堆栈指针。但是,既然已经创建了一个栈帧,现在sp指向栈的下层内存,push会增加sp的值吗?
-------------| <--sp
-------------|
-------------|
-------------|
-------------|
-------------|
-------------|

创建堆栈帧后:
-------------| <--s0
-------------|
-------------|
-------------|
-------------|
-------------|
-------------| <--sp

现在,插入堆栈必须导致 sp 增加,对吗?或者也可以使用帧指针 s0 进行推送?如果这是一个非常基本的问题,我深表歉意。谢谢你。

最佳答案

与 x86 ISA 不同——它有专门的指令用于入栈和出栈,RISC-V ISA 只能通过加载和存储指令访问内存。它没有访问堆栈(即内存)和修改堆栈指针的插入和弹出指令。

由于堆栈向下增长,减少堆栈指针,sp , 在堆栈上分配空间,而增加它会释放空间。即,addi sp,sp,-32在堆栈上分配 32 个字节和 addi sp,sp,32从堆栈中释放 32 个字节。前者创建新的堆栈帧,后者销毁它。
s0注册 - 与 fp 相同– 是帧指针,指向堆栈帧的开头。它的当前值保存在新创建的堆栈帧( sd s0,24(sp) )的最开始处。然后,它被设置为指向堆栈帧开头的地址 ( addi s0,sp,32 )。最后,在离开函数之前,帧指针将恢复为其先前的值( ld s0,24(sp) )。

堆栈帧创建和帧指针设置后堆栈的表示为:

|     ...     |
|-------------|<- s0 | beginning of stack frame
| previous s0 |
|-------------|<- sp-24
|-------------|
|-------------|
|-------------|
|-------------|
|-------------|
|-------------|
|-------------|<- sp | end of stack frame

关于assembly - 汇编中main函数开头的栈内存操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59302235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com