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

GCC如何保证C语言字符串以'\0'结尾?

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

    本文导语:  int main(){ char a[9]="abcdef"; } 然后部分反汇编是这样的 080483cd :  80483cd: 55                    push   %ebp  80483ce: 89 e5                 mov    %esp,%ebp  80483d0: 83 ec 10              sub    $0x10,%esp  80...

int main(){
char a[9]="abcdef";
}


然后部分反汇编是这样的

080483cd :
 80483cd: 55                    push   %ebp
 80483ce: 89 e5                 mov    %esp,%ebp
 80483d0: 83 ec 10              sub    $0x10,%esp
 80483d3: c7 45 f7 61 62 63 64  movl   $0x64636261,-0x9(%ebp)
 80483da: c7 45 fb 65 66 00 00  movl   $0x6665,-0x5(%ebp)
 80483e1: c6 45 ff 00           movb   $0x0,-0x1(%ebp)
 80483e5: c9                    leave  
 80483e6: c3                    ret    
 80483e7: 66 90                 xchg   %ax,%ax
 80483e9: 66 90                 xchg   %ax,%ax
 80483eb: 66 90                 xchg   %ax,%ax
 80483ed: 66 90                 xchg   %ax,%ax
 80483ef: 90                    nop

我就想问问,为什么0x80483e1地址处是movb   $0x0,-0x1(%ebp)字符串共6个字符,就是要填上7个字节数据,那么从-0x9(%ebp)开始填,不是应该在-0x3(%ebp)填上0x0吗?但为什么GCC要在-0x1(%ebp)填上0x0?这样填怎么能保证字符串是以0结尾的?

|
字符串总6字节,a是个数组,剩余部分都被填成0,a[6]至a[8]都是0
定义数组时,若只对数组部分元素赋初值,其他元素全被赋为0
80483d3:    c7 45 f7 61 62 63 64     movl   $0x64636261,-0x9(%ebp)    将abcd'放入%ebp-0x9,%ebp-0x8,%ebp-0x7,%ebp-0x6
80483da:    c7 45 fb 65 66 00 00     movl   $0x6665,-0x5(%ebp)  将ef00放入%ebp-0x5,%ebp-0x4,%ebp-0x3,%ebp-0x2
80483e1:    c6 45 ff 00              movb   $0x0,-0x1(%ebp)  将0放入%ebp-0x1

movl long四个字节,movb byte1个字节。a[9]共9字节,两次movl,一次movb

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












  • 相关文章推荐
  • gcc字符对齐问题的研究
  • 为什么gets()在gcc编译时会报warning,且经socket发往server端只显示一个字符?
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 使用popen来执行gcc命令,如何根据读出来的gcc的输出来判断gcc是否编译成功?
  • 命令:mips_fp_le-gcc,mipsel-gcc 是什么意思?跟一般的gcc有什么区别?
  • 怎样升级我的GCC呀,我用的RH7.2,GCC 2.96 ,我从网上下载了一个gcc-3.2.3.tar.gz
  • arm-elf-gcc 和 arm-linux-gcc有什么区别?arm-elf-gcc里的elf代表什么?
  • gcc-ccore、avr-gcc及arm-gcc的区别
  • gcc在哪里?bash:gcc:command not found
  • 如何删掉GCC3.0(我需要GCC2.0-----)
  • Windows版GCC TDM-GCC
  • 急问:如何卸掉gcc 3.2庄gcc 2.96
  • 有人遇到过吗,在安装GCC时提示,"checking gcc ...no "
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍 iis7站长之家
  • GCC无法安装的问题,希望有人帮我( Debian 4.04ra无法安装GCC)
  • Solaris8,安装了iconv,gcc和gcclib,然后用gcc编译c程序出错。
  • 一套未安装gcc的Linux中安装gcc rpm包时时出现错误
  • gcc与arm-linux-gcc编译的问题???
  • 下了一个GCC3.0包用tar xjfv gcc-3.0.tar.bz2解压后出现一堆文
  • 请问如何安装rpm格式的gcc如gcc-3.2.2-5.src.rpm,谢谢
  • arm-linux-gcc交叉编译出错,但gcc编译没错,什么原因呢???
  • 在redhat9下,如何将gcc3.x改为gcc2.x?
  • linux x86_64下由于拷贝gcc的lib目录导致gcc编译器出错


  • 站内导航:


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

    ©2012-2021,