C指针原理(86)-helloworld的C程序汇编剖析(2)

Tags: c语言

分析通过GCC编译C语言程序生成的汇编代码,能清楚得了解C语句运行机制、内存分配机制等隐藏在C语言代码下的内部工作原理。下面将对helloworld程序生成的汇编进行分析。

(1)寄存器基础知识

寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器。

虽然计算机都拥有内存,但由于CPU的运行速度一般比主内存的读取速度快,访问内存所需要的时间为数个时钟周期,要访问内存的话,就必须等待数个CPU周期从而造成浪费,因此内存并不是数据存取最快的装置,后来在现代计算机上使用的AMD或Intel微处理器在芯片内部集成了大小不等的数据高速缓存和指令高速缓存,统称为cache(高速缓存),cache让数据访问的速度适应CPU的处理速度,其原理是内存中程序执行与数据访问的局域性行为,即一定程序执行时间和空间内,被访问的代码集中于一部分,但是这些仍不是访问数据最快的途径。

寄存器是存储器层次结构中的最顶端,也是系统操作数据的最快速途径,但它数量少能存储的空间有限,它直接安放在中央处理器内,是有限存贮容量的高速存贮部件,可用来暂存指令、数据和地址。

IA-32处理器有8个通用寄存器,分别为:
EAX 一般用作累加器
EBX 一般用作基址寄存器(Base)
ECX 一般用来计数(Count)
EDX 一般用来存放数据(Data)
EBP 一般用作堆栈指针(Stack Pointer)
EBP 一般用作基址指针(Base Pointer)
ESI 一般用作源变址(Source Index)
EDI 一般用作目标变址(Destinatin Index)

IA-32处理器有6个常用的段寄存器,分别为 :
CS 代码段寄存器
DS 数据段寄存器
SS 堆栈段寄存器
ES、FS及GS 附加数据段寄存器

它还有标志寄存器EFLAGS,用来存放有关处理器的控制标志,此外还有控制寄存器.还拥有调试寄存器和测试寄存器以及系统地址寄存器。

这些寄存器,使用的最多的是通用寄存器,在AT&T汇编中,使用%寄存器名的方式表示通用寄存器,比如:

%ebx表示ebx寄存器

%ecx表示ecx寄存器

麦好的AI乐园博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/


(2)C变量内存分配

在C语言中,变量在内存中拥有自己的位置,这个位置就是变量的地址,可用指针来保存这个地址。而汇编语言中变量包括标记、数据类型、默认值三个部分,标记指示了变量的内存位置,存储的数据类型决定了变量在内存占有多少字节的空间,默认值决定了变量的初始值。观察上面C语言版的helloworld生成的汇编代码中的一段(如下所示),输出的helloworld字符串被放置在由“.LC0”标记的内存中,类型为string型,默认值为"hello,world"。

.LC0:

.string "hello,world"


本文链接:http://www.4byte.cn/learning/53387.html