大小端与边界对齐(计算机组成原理)

  • 时间:
  • 来源:互联网
  • 文章标签:

系列文章目录

这个学期我们进行学习了计算机组成原理的课程,我认为该课程十分的有趣。该文章将是计算机组成原理系列的第一篇文章!


文章目录

  • 系列文章目录
  • 前言
  • 一、.c文件到可执行.exe文件经历了什么?
  • 二、2,定义 int a=0x12345678; 请使较为简单的代码确定你机器的存储模式是大端模式还是小端模式(默认使用C语言)
  • 三、关于边界对齐
  • 总结


前言

我以前写了这么多的代码,学到这里,才发现原来在内存中还有大小端与边界对齐这些奇妙的东西。我们来了解下它吧。

提示:以下是本篇文章正文内容,下面案例可供参考

一、.c文件到可执行.exe文件经历了什么?

使用gcc编译系统分步翻译.c文件。依次得到预处理器的输出hello.i,编译器输出hello.s,汇编器输出hello.o,链接器输出hello.exe。其中,hello.i 和 hello.s 为文本格式,hello.o 和 hello.exe为二进制格式。
.i文件本质上还是高级语言源程序,.c预处理到.i文件,会对源程序中以#号开头的预编译命令进行处理,如果是#include,那么会将#include后面的文件内容嵌入到源程序中,生成信息量更大的.i文件。
.s文件是由汇编语言描述的。在.s文件中可以找到与hello.c 下功能上相对应代码段。
.o文件是.s文件上的汇编语言转换成的二进制序列。
.exe 是在.o文件上进行链接,将多个可重定位的文件和标准库函数合并,生成一个可执行的目标文件。

二、2,定义 int a=0x12345678; 请使较为简单的代码确定你机器的存储模式是大端模式还是小端模式(默认使用C语言)

答:使用的代码如下:

int a=0x12345678;
	printf(%x”,a);

最终打印输出12345678,所以是用小端模式存储的。

三、关于边界对齐

3,定义结构体如下:

1.	struct stest{  
2.	    int a;  
3.	    short b;  
4.	    double c;  
5.	    char d;  
6.	    short e;  
7.	}test;  
8.	  
9.	test.a = 0x12345678;  
10.	test.b = 0xabcd;  
11.	test.c = 1.0;  
12.	test.d = 0x09;  
13.	test.e = 0xeeff;  

试回答:
(1) test结构体变量在机器内存中共占用多少个字节?为什么?
答:占用20个字节,在x86中,为了加快取数操作,用到了端对齐,所以使得原本只需17个字节就可以存储的数据,却使用了20个字节。
(2) 用printf函数展示test各成员变量在内存中的位置和大小分布。
答:程序和运行结果如下:
在这里插入图片描述
在这里插入图片描述

(3)使用#pragma pack(n) 指定数据对齐方式(这里,n分别取1, 2, 4, 8),将(1)、(2)涉及的问题重新回答一遍,总结规律。
答:实际上数据的存储不是顺序存储的,有时候为了对齐需要补齐空字节。


总结

对计算机对.c文件编译进行了简单的分析和对大小端与边界对齐进行了试验。

本文链接http://www.taodudu.cc/news/show-1781928.html