首页
社区
课程
招聘
未解决 [求助] 为什么 C 语言的数组在 gcc 中反汇编和实际大小不符合 ?
发表于: 2019-7-8 00:02 2214

未解决 [求助] 为什么 C 语言的数组在 gcc 中反汇编和实际大小不符合 ?

2019-7-8 00:02
2214
源程序:
int main() {
    int i;
    char buffer[64];
    i = 1;
    buffer[0] = 'a';
    return 0;
}

反汇编:
Dump of assembler code for function main:
   0x0000000000001119 <+0>:     push   %rbp
   0x000000000000111a <+1>:     mov    %rsp,%rbp
   0x000000000000111d <+4>:     movl   $0x1,-0x4(%rbp)
   0x0000000000001124 <+11>:    movb   $0x61,-0x50(%rbp) # 这里为啥是 50 呀 
   0x0000000000001128 <+15>:    mov    $0x0,%eax
   0x000000000000112d <+20>:    pop    %rbp
   0x000000000000112e <+21>:    retq   
End of assembler dump.

这里为啥是 0x50 呀 ,不是应是 0x40(64) 吗 , 这里是涉及到那些知识,请大侠帮帮我 ! 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 347
活跃值: (1021)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
movb   $0x61,-0x50(%rbp) 是buffer[0] = 'a'; 说明了buffer的起始地址而已。
2019-7-8 02:58
1
雪    币: 28
活跃值: (90)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哈哈 找到了 是由于默认的 stack-protector 给加了个内容,再算上ebp : 8 + 8 + 4 +  64 = 84 。这样就说通了
gcc -fno-stack-protector -fno-asynchronous-unwind-tables  -S -O0 demo.c 

得到如下:
       .file        "demo.c"
       .text
       .globl        main
       .type        main, @function
main:
       pushq        %rbp
       movq        %rsp, %rbp
       movl        $1, -4(%rbp)
       movb        $97, -80(%rbp)
       movb        $97, -17(%rbp)
       movl        $0, %eax
       popq        %rbp
       ret
       .size        main, .-main
       .ident        "GCC: (GNU) 9.1.0"
       .section        .note.GNU-stack,"",@progbits
2019-7-8 03:13
0
雪    币: 28
活跃值: (90)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
       .file        "demo.c"
       .text
       .globl        main
       .type        main, @function
main:
       pushq        %rbp
       movq        %rsp, %rbp
       movl        %edi, -84(%rbp)
       movq        %rsi, -96(%rbp)
       movl        $1, -4(%rbp)
       movb        $97, -17(%rbp)   // 为什么是 -17 ,不是 -5?
       movl        $0, %eax
       popq        %rbp
       ret
       .size        main, .-main
       .ident        "GCC: (GNU) 9.1.0"
       .section        .note.GNU-stack,"",@progbits

=========
int main(int argc, char** argv) {
    int i;
    char buffer[64];
    
    i = 1;
    buffer[63] = 'a';
    return 0;
}
后面大师讨论说: 这里的 movb        $97, -17(%rbp) 的是由于 编译器的 16 字节对齐 ,所以开始是 17
2019-7-8 11:10
0
游客
登录 | 注册 方可回帖
返回
//