Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
%call16和.reloc在mips中是什么意思?_C_Assembly_Gcc_Mips_Mips32 - Fatal编程技术网

%call16和.reloc在mips中是什么意思?

%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; } 这是我无法理解的部分:

我已经使用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;
}
这是我无法理解的部分:

    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"
  • .reloc是什么意思
  • %call16是如何工作的
  • 变量fibSquared的对应值是多少
  • 如何调用和执行函数“printf”和“sqrt”

  • 我想你和我上同一门课,因为我有同样的家庭作业,所以我将分享我对自己的理解,这可能会有所帮助

    对于
    %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