函数返回前栈顶sp指针为什么在返回指令jr之后?
在jr之后的指令还能执行吗?
如glibc的ld库__libc_csu_init函数,不应该是先把栈顶指针sp回移,再返回吗?
但反汇编结果却是先返回,再移sp,都返回了,还怎么执行移sp?
不应该是先addiu sp,sp,56,再jr ra吗?,但实际却是这样的:
jr ra
addiu sp,sp,56
(jr之后的指令还能执行到吗?真是令人困惑。)
全部反汇编代码如下:
(mips32架构)
Dump of assembler code for function __libc_csu_init:
0x55610f60 <+0>: lui gp,0x3
0x55610f64 <+4>: addiu gp,gp,-24288
0x55610f68 <+8>: addu gp,gp,t9
0x55610f6c <+12>: addiu sp,sp,-56
0x55610f70 <+16>: sw ra,52(sp)
0x55610f74 <+20>: sw s5,48(sp)
0x55610f78 <+24>: sw s4,44(sp)
0x55610f7c <+28>: sw s3,40(sp)
0x55610f80 <+32>: sw s2,36(sp)
0x55610f84 <+36>: sw s1,32(sp)
0x55610f88 <+40>: sw s0,28(sp)
0x55610f8c <+44>: move s3,a0
0x55610f90 <+48>: lw t9,-29668(gp)
0x55610f94 <+52>: move s4,a1
0x55610f98 <+56>: sw gp,16(sp)
0x55610f9c <+60>: jalr t9
0x55610fa0 <+64>: move s5,a2
0x55610fa4 <+68>: lw gp,16(sp)
0x55610fa8 <+72>: lw s0,-29664(gp)
0x55610fac <+76>: lw s2,-29660(gp)
0x55610fb0 <+80>: subu s2,s2,s0
0x55610fb4 <+84>: sra s2,s2,0x2
--Type <RET> for more, q to quit, c to continue without paging--
0x55610fb8 <+88>: beqz s2,0x55610fe4 <__libc_csu_init+132>
0x55610fbc <+92>: move s1,zero
0x55610fc0 <+96>: lw t9,0(s0)
0x55610fc4 <+100>: move a2,s5
0x55610fc8 <+104>: move a1,s4
0x55610fcc <+108>: addiu s1,s1,1
0x55610fd0 <+112>: move a0,s3
0x55610fd4 <+116>: jalr t9
0x55610fd8 <+120>: addiu s0,s0,4
0x55610fdc <+124>: bne s2,s1,0x55610fc0 <__libc_csu_init+96>
0x55610fe0 <+128>: nop
0x55610fe4 <+132>: lw ra,52(sp)
0x55610fe8 <+136>: lw s5,48(sp)
0x55610fec <+140>: lw s4,44(sp)
0x55610ff0 <+144>: lw s3,40(sp)
0x55610ff4 <+148>: lw s2,36(sp)
0x55610ff8 <+152>: lw s1,32(sp)
0x55610ffc <+156>: lw s0,28(sp)
=> 0x55611000 <+160>: jr ra
0x55611004 <+164>: addiu sp,sp,56