`
deepfuture
  • 浏览: 4340987 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79516
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68575
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101715
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:281660
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14651
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65835
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31404
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45311
社区版块
存档分类
最新评论

char*与char[]-从编译后的汇编代码分析

阅读更多

含义
.text 已编译程序的机器代码
.rodata 只读数据,如pintf和switch语句中的字符串和常量值
.data 已初始化的全局变量
.bss 未初始化的全局变量
.symtab 符号表,存放在程序中被定义和引用的函数和全局变量的信息
.rel.text 当链接器吧这个目标文件和其他文件结合时,.text节中的信息需修改
.rel.data 被模块定义和引用的任何全局变量的信息
.debug 一个调试符号表。
.line 原始C程序的行号和.text节中机器指令之间的映射
.strtab 一个字符串表,其内容包含.systab和.debug节中的符号表

 

1、汇编相关段 的说明在上。

2、C源代码,x为char *,y为char []

 

#include <stdio.h>

void main(){

   char *x="xxxx";

   char y[]="yy";//y的16进制ASCII码是97,9797的十进制为31097

   printf("%s-----%s",x,y);

   exit(0);

}

deepfuture@deepfuture-laptop:~/private/mytest$ gcc -S testcr.c

 

.file "testcr.c"

.section .rodata

.LC0:

.string "xxxx"#使用char *分配

.LC1:

.string "%s-----%s"

.text

.globl main

.type main, @function

main:

pushl %ebp

movl %esp, %ebp

andl $-16, %esp

subl $32, %esp#分配32字节栈空间,根据变量情况分配

movl $.LC0, 24(%esp)#x变量使用指针(4个字节大小),放入栈中,可以看到,变量分配靠近栈空间的尾部

movw $31097, 29(%esp)#字符'yy'移到main程序的栈中,直接将y变量的值放入栈中

movb $0, 31(%esp)#加上NULL标志,表示字符结束 

movl $.LC1, %eax

leal 29(%esp), %edx

movl %edx, 8(%esp)

movl 24(%esp), %edx

movl %edx, 4(%esp)

movl %eax, (%esp)

call printf

movl $0, (%esp)

call exit

.size main, .-main

.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"

.section .note.GNU-stack,"",@progbits

 

3、由以上分析可以看出,在MAIN函数中char *分配在只读数据段中,实际使用时,只在程序栈中分配一个指针的空间。char[] 在程序栈中分配空间,然后直接使用movl、movw之类的汇编直接把值放入栈中空间。那么在其它函数中声明的呢,可以从以下程序中看出,仍然如此。

 

#include <stdio.h>

void myprinf(){

   char *x="xxxx";

   char y[]="yy";//y的16进制ASCII码是97,9797的十进制为31097

   printf("%s-----%s",x,y);

}

void main(){

   int num=1;

   myprint();

   exit(0);

}

deepfuture@deepfuture-laptop:~/private/mytest$ gcc -S testcr.c

ASM代码:

 

.file "testcr.c"

.section .rodata

.LC0:

.string "xxxx"

.LC1:

.string "%s-----%s"

.text

.globl myprinf

.type myprinf, @function

myprinf:

pushl %ebp

movl %esp, %ebp

subl $40, %esp

movl $.LC0, -16(%ebp)

movw $31097, -11(%ebp)

movb $0, -9(%ebp)

movl $.LC1, %eax

leal -11(%ebp), %edx

movl %edx, 8(%esp)

movl -16(%ebp), %edx

movl %edx, 4(%esp)

movl %eax, (%esp)

call printf

leave

ret

.size myprinf, .-myprinf

.globl main

.type main, @function

main:

pushl %ebp

movl %esp, %ebp

andl $-16, %esp

subl $32, %esp

movl $1, 28(%esp)

call myprint

movl $0, (%esp)

call exit

.size main, .-main

.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"

.section .note.GNU-stack,"",@progbits

 

 

 

1
2
分享到:
评论

相关推荐

    c编译器,将C语言编译成masm32汇编语言

    总共4个文件,2000多行的代码,其中sca.c是词法,p.c生成语法树,table.c是符号表,g.c是转化成具体masm32代码,只支持char,short,int,double四种类型数据,其他的有兴趣的可以自己修改增加,由于masm32限制,目前该...

    【TakeLionOS第七课】TakeLionOS汇编与C语言自学笔记-第六课.rar

    [TakeLionOS汇编与C语言自学笔记-第六课] 版权所有 2021年 江志剑 按照《21天学通C语言》(第七版),有如下一个例子P17。 将整个程序的代码,包括行号显示出来: //1、files:hellolistit.c hellolistitno.s ...

    数码管代码生成工具

    可以把0~9和数码管可以显示的字母生成C代码或汇编代码,直接点复制到Keil 中粘贴就可以了。以把注释部份做好了,很好用的工具哦!下面给出示例大家看看 本工具由我自己用E语言编程开发,在Win7,XP系统上调试过...

    [No.000001]2015-01-07汇编复习

    汇编, 破解, 反编译, 机器指令, 汇编指令;

    解析四则表达式的编译过程及生成汇编代码

    开发工具:VC2、问题描述编译整数四则运算表达式,将整数四则运算表达式翻译为汇编语言代码。消除左递归后的文法:E→TE’E’→+TE’ |εT→FT’T’→*FT’ |εF→(E) | i消除左递归后的翻译模式:E ::= T {E’.i:...

    编译原理 C编译器

    可将C语言的裴波纳契和pi.c的翻译为汇编语言。...3编译器演示程序,可将C语言子集测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误,如斐波那契数列程序,应能翻译为正确的汇编程序。

    编译原理简易C编译器

    只能实现斐波那契数列,没有实现pi.c,得分五分 ...3编译器演示程序,可将C语言子集测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误,如斐波那契数列程序,应能翻译为正确的汇编程序。

    实数与文本转化子程序

    &lt;br&gt;编译及运行要求:支持 Intel 指令集,支持 C 与汇编混合编译。(如 Windows + VC) &lt;br&gt;缘起:我在 C 标准库里似乎没有找到文本转化为实数的程序。因为要用,只好自己编了一个。为了方便起见,我在程序中...

    java堆栈的区别 -- 详解

    对应的汇编代码 10: a = c[1]; 00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a = p[1]; 0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 ...

    bd.rar_blu ray_header usb video_xl_透明加密

    曾经在某公司做过的代码,虽然代码并不美观,但却是稳定的用在产品中的,经过了大量测试。...注意:编译需要另外下载安装masm32 (http://www.movsd.com/),因为汇编代码需要其中提供的汇编形式的头文件

    《你必须知道的495个C语言问题》

    1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";} 18 *1.33 下面的初始化有什么问题?编译器提示“invalid initializers ”或其他信息。char *p=malloc(10); 19 1.34 char a[]= "string ...

    你必须知道的495个C语言问题

    1.32 下面的代码为什么不能编译?intf(){chara[]="Hello,world!";} *1.33 下面的初始化有什么问题?编译器提示“invalidinitializers”或其他信息。char*p=malloc(10); 1.34 chara[]="stringliteral";和char*p=...

    uboott移植实验手册及技术文档

    (3)将从Nor Flash启动改成从 NAND Flash启动 在文件中找到 195-201 代码,并在 201行后面添加如下代码: 195 copy_loop: 196 ldmia r0!, {r3-r10} /* copy from source address [r0] */ 197 stmiar1!, {r3-r10...

    C语言FAQ 常见问题列表

    o 2.11 代码 int f() { char a[] = "Hello, world!";} 不能编译。 o 2.12 这样的初始化有什么问题?char *p = malloc(10); 编译器提示 ``非法初始式" 云云。 o 2.13 以下的初始化有什么区别?char a[] = "string ...

    clature:clature是使用x86_64 NASM汇编代码生成的一种小型语言

    clature是使用x86_64 nasm汇编代码生成的一种小型语言。该语言没有类型,仅使用大小。 建造 制定目标 目标 描述 (没有) 符合./clature 查看 在./test/中运行测试脚本 安装 编译到/ usr / bin / ccl并将配置文件...

    delphi编译错误.txt

    Illegal character in input file: ''''&lt;char&gt;'''' ($) 在输入文件中的非法字符''''&lt;char&gt;'''' Illegal message method index 非法的消息方法指针 Illegal reference to symbol ''''&lt;Name&gt;'''' in object file ''''...

    单片机C语言入门-以最为流行的80C51 单片机为例来学习单片机的C 语言编程技术

    /*------------------------------------------------------------------------- REG51.H Header file for generic 80C51 and 80C31 microcontroller. Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil ...

Global site tag (gtag.js) - Google Analytics