摩尔定律

程序编码:
gcc指的是GCC C编译器。这是Linux上的默认编译器。

编译选项-Og 告诉编译器使用的优化等级。等级越高生成的机器码变化越大,程序性能越好。

编译过程: 

首先,C预处理器扩展源代码,插入所有#include的头文件,并扩展所有用#include声明的制定的宏。其次,编译器产生源文件的汇编代码.s。接下来,汇编器将汇编代码转化成二进制目标代码文件.o 。(目标代码是机器码的一种形式,它包含所有指令的二进制表示,但是没有填入全局地址)。最后,链接器将两个目标代码文件合并,产生最终的可执行文件。

在C程序中插入汇编代码有两种方式:

1.编写完整的函数放进独立的汇编代码文件中,最后让编译器和链接器把它和C的代码结合起来。  

2.使用GCC内嵌汇编,使用asm伪指令。

C声明Intel数据类型汇编代码后缀大小(字节)
char字节b

1

shortw2
int双字l4
long四字q8
char*四字q

8

float单精度s4
double双精度l8

访问信息:
一个x86-64的CPU包含一组16个存储64位值的——通用目的寄存器,这些存储器用来存储整数数据和指针。

操作数指示符:
大多数指令有一个或多个操作数(operand),指示出执行一个操作要使用的源数据值,以及放置结果的目的位置。
操作数分为三种类型:
立即数:表示常数值
寄存器:
内存引用:它会根据计算出来的地址(有效地址)访问某个内存位置。

数据传送指令:
MOV类主要有:movb,movw,movl,movq,区别在于他们操作的数据大小不同。
x86-64中增加了一条限制,传送指令的两个操作数 不能都指向内存位置!!!
将一个值从内存位值复制到另一个位置需要两条指令——先从内存取到寄存器,再从寄存器写入内存。

可以将较小的源值复制到较大的目的位置——零扩展和字符扩展。MOVZ,MOVS
movzbw,movzbl,movzwl,movzbq,movzwq
movsbw,movsbl,movswl,movsbq,movswq

局部变量通常保存在寄存器中。

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐