当前位置:  技术问答>linux和unix

熟悉MIPS汇编的请进

    来源: 互联网  发布时间:2016-05-05

    本文导语:  我在booter里面写了两个很简单的测试函数: static int g_test_i = 0; static int booter_test_r(int i) { return ++i; } static void booter_test_c(void) { booter_test_r(g_test_i); } 编译完后,反汇编得到的结果是: 9fc0bc60 : 9fc0bc60: 03e00008  j...

我在booter里面写了两个很简单的测试函数:
static int g_test_i = 0;
static int booter_test_r(int i)
{
return ++i;
}
static void booter_test_c(void)
{
booter_test_r(g_test_i);
}

编译完后,反汇编得到的结果是:
9fc0bc60 :
9fc0bc60: 03e00008  jr ra
9fc0bc64: 24820001  addiu v0,a0,1

9fc0bc68 :
9fc0bc68: 27bdfff0  addiu sp,sp,-16
9fc0bc6c: 03e00008  jr ra
9fc0bc70: 27bd0010  addiu sp,sp,16
9fc0bc74: 4d454d4b  0x4d454d4b
9fc0bc78: 00000000  nop
9fc0bc7c: 534e4f43  beql k0,t6,9fc1f98c 
9fc0bc80: 00000000  nop
9fc0bc84: 4b4f4943  c2 0x14f4943
9fc0bc88: 00000000  nop
9fc0bc8c: 4e455241  c3 0x455241
9fc0bc90: 00000000  nop
9fc0bc94: 74696e49  0x74696e49
9fc0bc98: 696c6169  0x696c6169
9fc0bc9c: 676e697a  0x676e697a
9fc0bca0: 65724120  0x65724120
9fc0bca4: 0a2e616e  j 98b985b8 
9fc0bca8: 00000000  nop
9fc0bcac: 49564544  0x49564544
9fc0bcb0: 00000000  nop
9fc0bcb4: 74696e49  0x74696e49
9fc0bcb8: 696c6169  0x696c6169
9fc0bcbc: 676e697a  0x676e697a
9fc0bcc0: 76654420  0x76654420
9fc0bcc4: 73656369  0x73656369
9fc0bcc8: 00000a2e  0xa2e
9fc0bccc: 49564e45  0x49564e45
9fc0bcd0: 00000000  nop
其中,9fc0bc84到9fc0bca0和9fc0bcac到9fc0bccc的内容根本就不是命令,乱七八糟的,是什么意思啊?
9fc0bca4: 0a2e616e  j 98b985b8 这句直接跳到了0x98b985b8 ,在我的板子上面是无效地址,为什么会这样?(链接脚本中指定的_gp=0x80009000,98b985b8 确实是_gp+0x18b8f5b8,CP0中的GP到底有什么具体的作用?)反汇编得到的到底是编译后的结果还是链接后的结果?
我的关键编译选项是:
-g -c  -ffreestanding  -O2 -Wall -Werror -Ws trict-prototypes -Wmissing-prototypes  -membedded-pic -mlong-calls -DCFG_EMBEDDE D_PIC=1 -DCFG_RUNFROMKSEG0=1 -EL
所有的booter代码都编译成PIC的。
请高手解答,困惑我两周了。

|
从你贴出的汇编看,我的理解是编译器好像在你的代码中做了手脚,才代码段中插入了一些数据。这个我以前好像也碰到过,但已经是很久以前的事情了,记不太清楚。建议你把这些二进制数据转换成文本看看,是不是上下文函数中有使用到这些文本的操作?

小小建议!^_^

|
楼主把编译优化关掉,这种反编译研究代码的,最好把优化关了。否则不是自己给搞朦了。其实要是功力深厚,优化后也可以看的。

-g -c  -ffreestanding  -O2 -Wall -Werror -Ws trict-prototypes -Wmissing-prototypes  -membedded-pic -mlong-calls -DCFG_EMBEDDE D_PIC=1 -DCFG_RUNFROMKSEG0=1 -EL

===>>
-g -c  -ffreestanding  -Wall -Werror -Ws trict-prototypes -Wmissing-prototypes  -membedded-pic -mlong-calls -DCFG_EMBEDDE D_PIC=1 -DCFG_RUNFROMKSEG0=1 -EL

你这里又是-g,有时O2的,没有这么玩的。O2之后就可能和源码对应不上了。其实就是一段简单得不能再简单的代码而已。

|
你先编译成目标文件.o然后再反编译看。。。
从现象看可能是链接器那里没设置对
9fc0bc78: 00000000 nop 这句完了那个booter_test_c应该就结束了
后面9fc0bc7c: 534e4f43 beql k0,t6,9fc1f98c  
有个条件判断就跳走了。。。

或者您的C代码没有贴完全。。


另,,,CP0中没有GP寄存器,GP寄存器是MIPS的通用寄存器,用来维护全局变量和静态变量的。。Global Pointer

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 急寻一位熟悉Linux熟悉GTK+编程,有时间的高手做一个例程,酬劳可谈
  • 学习linux该从何而起,熟悉java,但不是很熟悉c或者c++
  • 请问,哪里有可以用的aix server,我想练练,熟悉熟悉,要支持telnet的,
  • 熟悉linux
  • 小弟签约银行,想装个unix先熟悉一下!
  • 如何熟悉Exception的种类?完全通过学习API的document?
  • 有熟悉EXIM的高手高手么??
  • 熟悉Debian下dancer ircd配置的进来
  • 寻找对LINUX ORACLE熟悉的朋友
  • 熟悉CURSES的进!!!
  • 为何技术支持需要熟悉unix命令?
  • 请教熟悉JavaMail的大虾请帮帮忙,多谢了!
  • 想请教linux下开发分布式应用程序问题,期望与熟悉orbit的高手交流!
  • 寻求工作,本人熟练掌握ANSI CC++语言、熟悉UNIX
  • 我一直都是在windows上搞开发,对C非常熟悉,.........
  • 请熟悉IBM WebSphere配置者留下OICQ号
  • 紧急求助!谁熟悉websphere的配置?或关于webshpere好的网站!
  • 熟悉weblogic&ejb2.0的请进(初学者就不用看了)
  • 熟悉JAVA的请进来
  • 谁熟悉在DOS状态下上网浏览的软件。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3