I have converted a c code into mips32 using gcc compiler but there are some parts that I did not understand.
This is c code:
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;}
This is mips code:
.file 1 "" .section .mdebug.abi32 .previous .nan legacy .module fp=32 .module nooddspreg .abicalls .rdata .align 2$LC0: .ascii "%f\000" .text .align 2 .globl main .set nomips16 .set nomicromips .ent main .type main, @functionmain: .frame $fp,80,$31 # vars= 48, regs= 2/0, args= 16, gp= 8 .mask 0xc0000000,-4 .fmask 0x00000000,0 .set noreorder .cpload $25 .set nomacro addiu $sp,$sp,-80 sw $31,76($sp) sw $fp,72($sp) move $fp,$sp .cprestore 16 movz $31,$31,$0 sw $0,32($fp) sw $0,36($fp) sw $0,40($fp) sw $0,44($fp) sw $0,48($fp) sw $0,52($fp) sw $0,56($fp) sw $0,60($fp) sw $0,64($fp) sw $0,68($fp) sw $0,32($fp) li $2,1 # 0x1 sw $2,36($fp) li $2,2 # 0x2 sw $2,24($fp) b $L2 nop$L3: lw $2,24($fp) nop addiu $2,$2,-1 sll $2,$2,2 addiu $3,$fp,24 addu $2,$3,$2 lw $3,8($2) lw $2,24($fp) nop addiu $2,$2,-2 sll $2,$2,2 addiu $4,$fp,24 addu $2,$4,$2 lw $2,8($2) nop addu $3,$3,$2 lw $2,24($fp) nop sll $2,$2,2 addiu $4,$fp,24 addu $2,$4,$2 sw $3,8($2) lw $2,24($fp) nop addiu $2,$2,1 sw $2,24($fp)$L2: lw $2,24($fp) nop slt $2,$2,10 bne $2,$0,$L3 nop 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,sqrt1: 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,printf1: 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"
This is the part I could not understand:
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,sqrt1: 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,printf1: 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"
- What does .reloc mean?
- How does %call16 work?
- What is the corresponding value of the variable fibSquared?
- How the functions "printf" and "sqrt" are called and executed?