搜索
bottom↓
回复: 7

这段mips代码在讲什么啊?帮我看看呗,一小段。

[复制链接]

出0入0汤圆

发表于 2015-11-22 14:02:15 | 显示全部楼层 |阅读模式

兄弟们帮我看看,是在判断什么条件啊?这算是一个完整函数么?

这个应该是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

出0入0汤圆

 楼主| 发表于 2015-11-22 14:02:56 | 显示全部楼层
或者能否转换成c?我理解理解。

出0入0汤圆

发表于 2017-2-20 15:58:14 | 显示全部楼层
<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赋值,后续退出此循环的代码永远不会被执行到,楼主你确定代码复制正确了么

出0入0汤圆

发表于 2017-2-20 21:13:50 | 显示全部楼层
int support_mifi(void)
{
    return check_support_mifi(7);
}

之所以显示jal 0, 是因为还没有重定位, 符号地址还没解析. check_support_mifi是我随便猜测一个名字

出0入0汤圆

 楼主| 发表于 2017-2-21 17:40:15 | 显示全部楼层
zzj0329 发表于 2017-2-20 15:58
:                                //程序标号,相当于C语言里声明一个函数名
addiu        sp,sp,-24      ...

好的,多谢。代码应该没错。量产代码来着。

出0入0汤圆

 楼主| 发表于 2017-2-21 17:40:35 | 显示全部楼层
putty 发表于 2017-2-20 21:13
int support_mifi(void)
{
    return check_support_mifi(7);

感谢。这样看就清晰多了。

出0入0汤圆

发表于 2017-2-21 21:59:23 | 显示全部楼层
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函数内
(为了保险起见不让程序跑飞所以编译器在每个函数头尾相呼应,头部向栈申请空间,保存跳入指针,尾部回读之前的指针,返回之前调用此函数的地方并恢复栈指针)

出0入0汤圆

发表于 2017-2-22 13:28:40 | 显示全部楼层
zzj0329 发表于 2017-2-21 21:59
你这个相当于将楼主位的jal 0替换成了jal 0
MIPS汇编里通用寄存器a0~a3通常作为函数的参数传入寄存器,跳 ...

楼主很可能反汇编的是.o文件, 没有最终链接, 所以看到jal 0, 不要以为就是要跳到support_mifi去. 最终链接时, 地址0会被解析的.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 14:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表