免费注册 查看新帖 |

Chinaunix

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

[C] 谁能帮我解释一下这段汇编 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-03 16:29 |只看该作者 |倒序浏览
本帖最后由 goingstudy 于 2015-06-03 16:38 编辑

这是C 代码:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char str[16]= "";

  5.         if ( str[0] != '\0')
  6.                 printf("1\n");
  7.         else
  8.                 printf("2\n");

  9.         return 0;
  10. }
复制代码
gcc -S 对应的汇编:
  1.         .file        "1.c"
  2.         .section        .rodata
  3. .LC1:
  4.         .string        "1"
  5. .LC2:
  6.         .string        "2"
  7. .LC0:
  8.         .string        ""
  9.         .zero        15
  10.         .text
  11. .globl main
  12.         .type        main, @function
  13. main:
  14. .LFB2:
  15.         pushq        %rbp
  16. .LCFI0:
  17.         movq        %rsp, %rbp
  18. .LCFI1:
  19.         subq        $16, %rsp
  20. .LCFI2:
  21.         movzbl        .LC0(%rip), %eax      ;这个是取.LC0处的一个字符放到eax中吗?
  22.         movb        %al, -16(%rbp)         ;然后放到str[]数组的第1个元素
  23.         movq        $0, -15(%rbp)          ;0->str的第2-9个元素
  24.         movl                $0, -7(%rbp)            ;0->str的第10-13个元素
  25.         movw        $0, -3(%rbp)           ;0->str的第14-15个元素
  26.         movb        $0, -1(%rbp)           ;0->str的第16个元素
  27.         movzbl        -16(%rbp), %eax    ;取str的第一个元素到eax中
  28.         testb        %al, %al                         ;这个地方为什么这么测试?
  29.         je        .L2
  30.         movl        $.LC1, %edi
  31.         call        puts
  32.         jmp        .L4
  33. .L2:
  34.         movl        $.LC2, %edi
  35.         call        puts
  36. .L4:
  37.         movl        $0, %eax
  38.         leave
  39.         ret
  40. .LFE2:
  41.         .size        main, .-main
  42.         .section        .eh_frame,"a",@progbits
  43. .Lframe1:
  44.         .long        .LECIE1-.LSCIE1
  45. .LSCIE1:
  46.         .long        0x0
  47.         .byte        0x1
  48.         .string        "zR"
  49.         .uleb128 0x1
  50.         .sleb128 -8
  51.         .byte        0x10
  52.         .uleb128 0x1
  53.         .byte        0x3
  54.         .byte        0xc
  55.         .uleb128 0x7
  56.         .uleb128 0x8
  57.         .byte        0x90
  58.         .uleb128 0x1
  59.         .align 8
  60. .LECIE1:
  61. .LSFDE1:
  62.         .long        .LEFDE1-.LASFDE1
  63. .LASFDE1:
  64.         .long        .LASFDE1-.Lframe1
  65.         .long        .LFB2
  66.         .long        .LFE2-.LFB2
  67.         .uleb128 0x0
  68.         .byte        0x4
  69.         .long        .LCFI0-.LFB2
  70.         .byte        0xe
  71.         .uleb128 0x10
  72.         .byte        0x86
  73.         .uleb128 0x2
  74.         .byte        0x4
  75.         .long        .LCFI1-.LCFI0
  76.         .byte        0xd
  77.         .uleb128 0x6
  78.         .align 8
  79. .LEFDE1:
  80.         .ident        "GCC: (GNU) 4.1.2 20071124 (Red Hat 4.1.2-42)"
  81.         .section        .note.GNU-stack,"",@progbits
复制代码
我上面的那段注释理解的正确吗?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2015-06-03 16:40 |只看该作者
movzbl  0扩展赋值
testb  对应你的 if

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
3 [报告]
发表于 2015-06-03 16:43 |只看该作者
回复 2# hellioncu

0扩展我知道,但是testb为什么那样测试?
还有能帮我看一下上面的那段注释正确吗?
我是感觉还是有些地方说不通
   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2015-06-03 16:45 |只看该作者
goingstudy 发表于 2015-06-03 16:43
回复 2# hellioncu

0扩展我知道,但是testb为什么那样测试?


你认为应该怎样 testb?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
5 [报告]
发表于 2015-06-03 17:05 |只看该作者
回复 4# hellioncu

大哥不要调戏我啊,
我是比较 str[0] != "", testb %al,%al中,al是str[0]处的值?
   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2015-06-03 17:15 |只看该作者
goingstudy 发表于 2015-06-03 17:05
回复 4# hellioncu

大哥不要调戏我啊,


前面那句不是mov到eax了么,eax跟al啥关系你总知道吧

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
7 [报告]
发表于 2015-06-03 18:32 |只看该作者
回复 6# hellioncu

我知道啊,eax的al是str的第一个元素,然后不应该是与.LC0处的东西去比较?
此处是gcc的优化还是什么?
还有就是对str数组的初始化为什么是那样,我是cahr str[16] = "",那初始化不应该是从.LC0处去读内容来初始化?
也是gcc的优化吗?

   

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
8 [报告]
发表于 2015-06-03 19:01 |只看该作者
如果跟.LC0+0偏移比较的话,就是相对寻址了,还没mov到eax里面去来的快


你这个还没开启优化吧,开启优化了,那个判断应该都会被干掉,只有一个printf

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP