免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4781 | 回复: 9
打印 上一主题 下一主题

请教:objdump产生的C代码ARM汇编 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-09 09:23 |只看该作者 |倒序浏览
C代码:

//foo.c
void foo(int m, int n)
{
    printf("m=%d, n=%d\n", m, n);
}

int main()
{
    int b = 3;
    foo(b+=3, ++b);
    printf("b=%d\n", b);
         return 0;
}


上面c代码对应的汇编代码:
arm-linux-objdump foo.o

temp.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <foo>:
   0:        e1a0c00d         mov        ip, sp
   4:        e92dd800         stmdb        sp!, {fp, ip, lr, pc}
   8:        e24cb004         sub        fp, ip, #4        ; 0x4//上面这三句话建立栈回朔结构体

   c:        e24dd008         sub        sp, sp, #8        ; 0x8

  10:        e50b0010         str        r0, [fp, #-16]
  14:        e50b1014         str        r1, [fp, #-20]     //压栈,保存int m和int n; m=r0,n=r1;

  18:        e59f0010         ldr        r0, [pc, #16]        ; 30 <.text+0x30>//z这句话是什么意思?转到调用printf?
  1c:        e51b1010         ldr        r1, [fp, #-16]
  20:        e51b2014         ldr        r2, [fp, #-20]
  24:        ebfffffe         bl        24 <foo+0x24>

  28:        e24bd00c         sub        sp, fp, #12        ; 0xc//这里应该是恢复栈寄存器的内容了
  2c:        e89da800         ldmia        sp, {fp, sp, pc}
  30:        00000000         andeq        r0, r0, r0

00000034 <main>:
  34:        e1a0c00d         mov        ip, sp
  38:        e92dd800         stmdb        sp!, {fp, ip, lr, pc}
  3c:        e24cb004         sub        fp, ip, #4        ; 0x4
  40:        e24dd004         sub        sp, sp, #4        ; 0x4

  44:        e3a03003         mov        r3, #3        ; 0x3
  48:        e50b3010         str        r3, [fp, #-16]
  4c:        e51b3010         ldr        r3, [fp, #-16]  //[fp,#-16] 是b的内存空间;b=3; r3=3;

  50:        e2833003         add        r3, r3, #3        ; 0x3 //b+=3;r3=6;
  54:        e1a02003         mov        r2, r3            //r2=6;

  58:        e50b2010         str        r2, [fp, #-16]
  5c:        e51b3010         ldr        r3, [fp, #-16]

  60:        e2833001         add        r3, r3, #1        ; 0x1
  64:        e50b3010         str        r3, [fp, #-16]       //r3=7;

  68:        e1a00002         mov        r0, r2
  6c:        e1a01003         mov        r1, r3//r0=6;r1=7;r2=6;r3=7;  传递参数用r0和r1,r2,r3只是中间变量,不用计较,所以arm-linux-gcc 在传递函数参数时是从左至右的
  70:        ebfffffe         bl        70 <main+0x3c>//这句话怎么就调用子函数了?
  74:        e59f0010         ldr        r0, [pc, #16]        ; 8c <.text+0x8c>
  78:        e51b1010         ldr        r1, [fp, #-16]
  7c:        ebfffffe         bl        7c <main+0x48>
  80:        e3a03000         mov        r3, #0        ; 0x0
  84:        e1a00003         mov        r0, r3
  88:        e89da808         ldmia        sp, {r3, fp, sp, pc}
  8c:        0000000c         andeq        r0, r0, ip
Disassembly of section .rodata:

00000000 <.rodata>:
   0:        64253d6d         strvst        r3, [r5], #-3437
   4:        3d6e202c         stcccl        0, cr2, [lr, #-176]!
   8:        000a6425         andeq        r6, sl, r5, lsr #8
   c:        64253d62         strvst        r3, [r5], #-3426
  10:        0000000a         andeq        r0, r0, sl
Disassembly of section .comment:

00000000 <.comment>:
   0:        43434700         cmpmi        r3, #0        ; 0x0
   4:        4728203a         undefined
   8:        2029554e         eorcs        r5, r9, lr, asr #10
   c:        2e342e33         mrccs        14, 1, r2, cr4, cr3, {1}
  10:        Address 0x10 is out of bounds.



请教上面用蓝色标注的问题,谢谢大家

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-04-09 09:59 |只看该作者
bl        70
bl        7c等
备将来重定位之用,目前是多少不重要,因为根本没用
另外,C语言代码写的违反相关规定,编译器相关。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2008-04-09 10:26 |只看该作者
另外,建议不要反编译去看
用-S去看

论坛徽章:
0
4 [报告]
发表于 2008-04-09 10:37 |只看该作者
原帖由 cjaizss 于 2008-4-9 09:59 发表
bl        70
bl        7c等
备将来重定位之用,目前是多少不重要,因为根本没用
另外,C语言代码写的违反相关规定,编译器相关。



>>>>>C语言代码写的违反相关规定,编译器相关

版主一语中的,这两天我研究这个。
那如何改写上面的代码,让code成为编译器不相关的呢?

论坛徽章:
0
5 [报告]
发表于 2008-04-09 10:49 |只看该作者

回复 #4 rocky1972 的帖子

从第一贴可以得出这个结论:arm-linux-gcc 调用函数传递参数时的顺序是自左向右的

但是我还试了下面这个程序:

int main()
{
        int x=5;

        //arm-linux-gcc 的参数传递顺序是自左向右,看起来应该输出  5,5,7,而实际上确输出7,5,7  。 看了一下反汇编的代码,真是7,5,7!
        printf("%d,%d,%dn",x,x++,++x);
                                                                                       
        return 0;
}


////////////////////////////////////////////////////
temp.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <main>:
   0:        e1a0c00d         mov        ip, sp
   4:        e92dd800         stmdb        sp!, {fp, ip, lr, pc}
   8:        e24cb004         sub        fp, ip, #4        ; 0x4
   c:        e24dd004         sub        sp, sp, #4        ; 0x4

  10:        e3a03005         mov        r3, #5        ; 0x5
  14:        e50b3010         str        r3, [fp, #-16]     //x=5;r3=5;

  18:        e24b2010         sub        r2, fp, #16        ; 0x10
  1c:        e5923000         ldr        r3, [r2]

  20:        e1a0c003         mov        ip, r3              //ip=5;
  24:        e2833001         add        r3, r3, #1        ; 0x1  //r3=6;

  28:        e5823000         str        r3, [r2]
  2c:        e51b3010         ldr        r3, [fp, #-16]     //x=6;

  30:        e2833001         add        r3, r3, #1        ; 0x1
  34:        e50b3010         str        r3, [fp, #-16]     //x=7;r3=7;

  38:        e59f0014         ldr        r0, [pc, #20]        ; 54 <.text+0x54>
  3c:        e51b1010         ldr        r1, [fp, #-16]
  40:        e1a0200c         mov        r2, ip             //r1=7;r2=5;/r3=7;
  44:        ebfffffe         bl        44 <main+0x44>
  48:        e3a03000         mov        r3, #0        ; 0x0
  4c:        e1a00003         mov        r0, r3
  50:        e89da808         ldmia        sp, {r3, fp, sp, pc}
  54:        00000000         andeq        r0, r0, r0


代码输出7,5,7的困惑没了;
感觉上面那段代码的输出就应该是5,5,7,小弟既感觉自己的理解还不是很到位,又觉得编译器很自作多情。

现在想请教cjaizss 版主如何写出和编译器不相关的代码,或者退一步,如何更改本帖的代码,让它输出5,5,7

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2008-04-09 10:53 |只看该作者
不要在一句话里连续使用多处对同一变量赋值(++,--也算)

论坛徽章:
0
7 [报告]
发表于 2008-04-09 11:29 |只看该作者
不要对编译器做任何假定,也不要这样往死胡同里钻.

论坛徽章:
0
8 [报告]
发表于 2008-04-09 13:36 |只看该作者
原帖由 cjaizss 于 2008-4-9 10:53 发表
不要在一句话里连续使用多处对同一变量赋值(++,--也算)



谢谢指教
BOW

论坛徽章:
0
9 [报告]
发表于 2008-04-09 20:32 |只看该作者
这样钻牛角尖儿没好处。

论坛徽章:
0
10 [报告]
发表于 2008-04-09 20:35 |只看该作者

回复 #9 agaric 的帖子

嘿嘿
只是觉得好奇而已
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP