这段mips代码在讲什么啊?帮我看看呗,一小段。
兄弟们帮我看看,是在判断什么条件啊?这算是一个完整函数么?
这个应该是mips的汇编。
先谢过了。
<support_mifi>:
addiu sp,sp,-24
sw ra,16(sp)
jal 0 <support_mifi>
li a0,7
lw ra,16(sp)
nop
jr ra
addiu sp,sp,24
或者能否转换成c?我理解理解。 <support_mifi>: //程序标号,相当于C语言里声明一个函数名
addiu sp,sp,-24 //向堆栈指针申请6行代码的空间
sw ra,16(sp) //将之前的函数返回值ra存放到栈里保护
jal 0 <support_mifi> //跳到support_mifi这个函数,注意jal指令会更新ra(函数返回地址),所以在上一步保存了
li a0,7 //a0这个通用寄存器赋值7,注意此条执行为jal的延时操位置,即先执行此条指令再执行上一条的跳转
lw ra,16(sp) //将之前保存的函数返回地址取回
nop //空操作
jr ra //跳回ra寄存器的地址
addiu sp,sp,24 //恢复栈指针
看起来像是不断的重入support_mifi,不断的申请栈存放之前的重入前地址,反复给a0赋值,后续退出此循环的代码永远不会被执行到,楼主你确定代码复制正确了么 int support_mifi(void)
{
return check_support_mifi(7);
}
之所以显示jal 0, 是因为还没有重定位, 符号地址还没解析. check_support_mifi是我随便猜测一个名字 zzj0329 发表于 2017-2-20 15:58
: //程序标号,相当于C语言里声明一个函数名
addiu sp,sp,-24 ...
好的,多谢。代码应该没错。量产代码来着。 putty 发表于 2017-2-20 21:13
int support_mifi(void)
{
return check_support_mifi(7);
感谢。这样看就清晰多了。 putty 发表于 2017-2-20 21:13
int support_mifi(void)
{
return check_support_mifi(7);
你这个相当于将楼主位的jal 0<support_mifi>替换成了jal 0<check_support_mifi>
MIPS汇编里通用寄存器a0~a3通常作为函数的参数传入寄存器,跳转之前将check_support_mifi的第0个参数赋值7了,
此时已经跳走了,后续的几行代码基本上是占位用,因为根本不会执行到,除非check_support_mifi函数内倒数第2行还有句jr ra指令返回到support_mifi函数内
(为了保险起见不让程序跑飞所以编译器在每个函数头尾相呼应,头部向栈申请空间,保存跳入指针,尾部回读之前的指针,返回之前调用此函数的地方并恢复栈指针) zzj0329 发表于 2017-2-21 21:59
你这个相当于将楼主位的jal 0替换成了jal 0
MIPS汇编里通用寄存器a0~a3通常作为函数的参数传入寄存器,跳 ...
楼主很可能反汇编的是.o文件, 没有最终链接, 所以看到jal 0, 不要以为就是要跳到support_mifi去. 最终链接时, 地址0会被解析的.
页:
[1]