当前位置: 技术问答>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的。
请高手解答,困惑我两周了。
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之后就可能和源码对应不上了。其实就是一段简单得不能再简单的代码而已。
-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
从现象看可能是链接器那里没设置对
9fc0bc78: 00000000 nop 这句完了那个booter_test_c应该就结束了
后面9fc0bc7c: 534e4f43 beql k0,t6,9fc1f98c
有个条件判断就跳走了。。。
或者您的C代码没有贴完全。。
另,,,CP0中没有GP寄存器,GP寄存器是MIPS的通用寄存器,用来维护全局变量和静态变量的。。Global Pointer