gpt4 book ai didi

C 到 Cross Compiler 的 Assembly MIPS(需要解释 $sp, $fp)

转载 作者:太空宇宙 更新时间:2023-11-04 06:30:42 25 4
gpt4 key购买 nike

编译此 C 代码后:

int main(void)
{
unsigned int i = 5;
switch(i)
{
case 1: i = i + 3; break;
case 5: i = i<<3; break;
case 10: i = i>>2;
}
}

我有这个汇编 MIPS:

.file   1 "SwitchCase.c"
.text
.align 2
.globl main
.ent main
main:
.frame $fp,16,$31 # vars= 8, regs= 1/0, args= 0, gp= 0
.mask 0x40000000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-16
sw $fp,8($sp)
move $fp,$sp
li $2,5 # 0x5
sw $2,0($fp)
lw $2,0($fp)
sw $2,4($fp)
li $2,5 # 0x5
lw $3,4($fp)
beq $3,$2,$L4
lw $3,4($fp)
sltu $2,$3,6
beq $2,$0,$L6
li $2,1 # 0x1
lw $3,4($fp)
beq $3,$2,$L3
j $L2
$L6:
li $2,10 # 0xa
lw $3,4($fp)
beq $3,$2,$L5
j $L2
$L3:
lw $2,0($fp)
addiu $2,$2,3
sw $2,0($fp)
j $L2
$L4:
lw $2,0($fp)
sll $2,$2,3
sw $2,0($fp)
j $L2
$L5:
lw $2,0($fp)
srl $2,$2,2
sw $2,0($fp)
$L2:
move $sp,$fp
lw $fp,8($sp)
addiu $sp,$sp,16
j $31
.end main

我不太了解这个汇编 MIPS,尤其是带有 $sp, $fp 寄存器的指令(这些寄存器用于此代码的目的),有人可以帮我解释一下这个汇编吗?

最佳答案

从评论中判断实际问题:“我认为只要有子程序我们就必须使用 $sp、$fp,但我在这里不使用任何子程序(过程),为什么这段代码有 $sp, $fp 寄存器吗?"

一方面,main 仍然需要一个自己的栈帧来保存局部变量(和临时的、未命名的值),所以这就是为什么它需要一个有效的帧指针( $fp).

如果你想知道为什么它会保存之前的帧指针,那是因为即使 main 也会被其他函数调用(在某些 CRT 库中通常称为 _start),需要保留其框架。

main 是否依次调用其他子例程是无关紧要的,因为这并不能使它摆脱对堆栈框架的需求,如上所述。

此外,作为平台 ABI 的一部分,通常指定所有功能都应设置适当的框架,无论它们是否实际需要它们。这是因为堆栈上适当的帧链通常对调试器和其他分析工具很有用,但事后发现在需要时缺少它们​​通常会很痛苦(例如对崩溃程序进行事后调试) .但是,如果您确实想要这样做,您可以通过使用一些特定于编译器的标志(例如 -fomit-frame-pointer)告诉大多数编译器忽略它们,这违反了 ABI。

关于C 到 Cross Compiler 的 Assembly MIPS(需要解释 $sp, $fp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20918218/

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