%call16和.reloc在mips中是什么意思?
我已经使用gcc编译器将c代码转换为mips32,但有些部分我不理解 这是c代码:%call16和.reloc在mips中是什么意思?,c,assembly,gcc,mips,mips32,C,Assembly,Gcc,Mips,Mips32,我已经使用gcc编译器将c代码转换为mips32,但有些部分我不理解 这是c代码: int main() { float fibSquared; int F[10] = {0}; F[0] = 0; F[1] = 1; for(int i = 2; i < 10 ; i++) F[i] = F[i-1] + F[i-2]; fibSquared = sqrt(F[9]); printf("%f",fibSquared); return 0; } 这是我无法理解的部分:
int main()
{
float fibSquared;
int F[10] = {0};
F[0] = 0;
F[1] = 1;
for(int i = 2; i < 10 ; i++)
F[i] = F[i-1] + F[i-2];
fibSquared = sqrt(F[9]);
printf("%f",fibSquared);
return 0;
}
这是我无法理解的部分:
lw $2,68($fp)
nop
mtc1 $2,$f0
nop
cvt.d.w $f0,$f0
mov.d $f12,$f0
lw $2,%call16(sqrt)($28)
nop
move $25,$2
.reloc 1f,R_MIPS_JALR,sqrt
1: jalr $25
nop
lw $28,16($fp)
cvt.s.d $f0,$f0
swc1 $f0,28($fp)
lwc1 $f0,28($fp)
nop
cvt.d.s $f0,$f0
mfc1 $7,$f0
mfc1 $6,$f1
lw $2,%got($LC0)($28)
nop
addiu $4,$2,%lo($LC0)
lw $2,%call16(printf)($28)
nop
move $25,$2
.reloc 1f,R_MIPS_JALR,printf
1: jalr $25
nop
lw $28,16($fp)
move $2,$0
move $sp,$fp
lw $31,76($sp)
lw $fp,72($sp)
addiu $sp,$sp,80
j $31
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609"
我想你和我上同一门课,因为我有同样的家庭作业,所以我将分享我对自己的理解,这可能会有所帮助 对于
%call16
,如果您注意到括号之间是C代码从包含的文件中使用的名称,例如stdio.h
中的printf
,以及math
文件中的sqrt
,因此C代码清楚地调用了它们,以便他可以使用它们
关于.reloc
,我注意到它们位于%call16
之后,被调用的函数被执行,用于重新定位内存,因此我认为它会重新排序可能发生的任何损坏所包含的文件
fibSquared
值位于mem[-12](SW$3,8$2))$2=-20
,然后通过(mtc1$2,$f0)将其移动到$f0。在指令中,第二个PAR是<代码>目的地($F0)< /代码>。它从int
转换为float-in(cvt.d.w$f0,$f0)
在本部分代码中执行的sqrt
:
lw $2,%call16(sqrt)($28) \\ in this particular
nop
move $25,$2
.reloc 1f,R_MIPS_JALR,sqrt
1: jalr $25
$25 at the beginning was chosen for cpload (.cpload $25)
** printf :
lw $2,%got($LC0)($28)
nop
addiu $4,$2,%lo($LC0)
lw $2,%call16(printf)($28)\\ in this particular
nop
move $25,$2
.reloc 1f,R_MIPS_JALR,printf
1: jalr $25
1.2.请阅读。多问题的帖子,不适合好的线程。我不认为重新排序包含的文件可能已经发生的任何损坏。有道理。这些C.h
文件不包括在asm中。我不知道它到底做了什么,但它可能告诉汇编程序发出链接器可能使用的重新定位元数据,如果你静态链接它,它可能会将jalr
放松为一个简单的jal
,而不是使用从get加载的指针。@PeterCordes谢谢你,实际上你说的更有意义。
lw $2,%call16(sqrt)($28) \\ in this particular
nop
move $25,$2
.reloc 1f,R_MIPS_JALR,sqrt
1: jalr $25
$25 at the beginning was chosen for cpload (.cpload $25)
** printf :
lw $2,%got($LC0)($28)
nop
addiu $4,$2,%lo($LC0)
lw $2,%call16(printf)($28)\\ in this particular
nop
move $25,$2
.reloc 1f,R_MIPS_JALR,printf
1: jalr $25