当前位置:首页 » 编程软件 » 编译器对接指令集

编译器对接指令集

发布时间: 2022-08-23 13:43:35

1. c语言编译与处理器的指令集有关吗一定要CISC吗RISC可不可以

C语言只是用于描述问题和算法的一种语言,而在实际机器上真实运行的却是各处理器自己的机器指令。编译器的工作就是将C语言翻译为机器指令。对你的问题答复如下:1. C语言与指令系统没有关系,但是编译器翻译的指令与指令系统有关系;2.无论CISC还是RISC,编译器都可以将C语言翻译为对应的机器指令。

2. 如何使用SSE指令集编写应用程序

1、编译器的自动矢量化

-mfpmath=sse

仅建议在P4和K8以上级别的处理器上使用该选项。

-mmmx

-msse
-msse2
-msse3
-m3dnow
-mssse3(gcc-4.3新增)
-msse4.1(gcc-4.3新增)
-msse4.2(gcc-4.3新增)
-msse4(含4.1和4.2,gcc-4.3新增)
是否使用相应的扩展指令集以及内置函数,需要按照自己的cpu做选择。

2、使用C/C++类库

目前,GNU
GCC等大多数编译器都提供了对SSE指令集的变成支持,允许用户在C++代码中不用编写汇编代码,就可以直接通过调用库函数而直接使用SSE指令。

3、使用编译器的内嵌原语(Intrinsics)

SSE的intrinsics的规则

_mm_<opcode>_<suffix>

其中,<opcode>是指令的类别,像add、sub等等,<suffix>是指令的种类。在SSE浮点运算指令中,只有两种:ps和ss。

ps:Packed
Single-precision,指对寄存器中的四个单精度浮点同时进行运算。

ss:Scaler
Single-precision,指对寄存器中的DATA0进行运算。

编程时需要包含下表所示的头文件:

mmintrin.h

MMX

xmmintrin.h

SSE

emmintrin.h

SSE2

pmmintrin.h

SSE3

tmmintrin.h

SSSE3

intrin.h

SSE4A

smmintrin.h

SSE4.1

nmmintrin.h

SSE4.2

mm3dnow.h

3DNOW

说明:如果导入一个高版本的指令集头文件,那么一般就不需要在导入低版本的指令了。

4、使用内嵌汇编

指令语法特征

如:PADDUSW(无符号饱和模式的字组相加)

前缀:P代表成组数据类型

操作指令:如ADD、SUB等

后缀:US为无符号饱和处理

S为有符号饱和处理

B、W、D、Q分别为字节组、字组、双字组、四字。

GCC的asm结构

用汇编编写的程序运行速度快,但开发速度非常慢,效率也很低。如果只是想对关键代码段进行优化,更好的办法是将汇编指令嵌入到C语言程序中,充分利用高级语言和汇编语言各自的优点。一般来讲,在C代码中嵌入汇编语句要比“纯粹”的汇编语言代码复杂的多,因为需要解决如何分配寄存器,以及如何与C代码中的变量相结合等问题。内联汇编能够灵活操作,而且可以使其输出通过C变量显示出来。因为它具有这种能力,所以asm可以用作汇编指令和C程序之间的接口。使用__asm__关键字,如果超过一行的指令,每行要加上双引号,并且后面加上\n\t。如果希望确保编译器不会在“asm”内部优化指令,可以在“__asm__”后面使用关键字“volatile”。

内联汇编的基本要素

具体语法结构,请看我的一篇博文:《GCC内嵌汇编》文章连接:

http://blog.chinaunix.net/u3/119372/showart_2417924.html

基本要素说明:

限定符

意义

“m” “v” “o”

内存单元

“r”

任意寄存器

“q”

寄存器eax,ebx,ecx,edx之一

“i” “h”

直接操作数

“E” “F”

浮点数

“g”

任意

“a” ”b” ”c” ”d”

分别表示寄存器eax,ebx,ecx,edx

“S” ”D”

寄存器esi,edi

“I”

常数(0至31)

5、SSE编程注意事项

数据对齐

CPU内存单元以16Byte为边界,如果数据在运算之前不进行对齐,会是指令运算产生大量延时。

GCC:

float
__attribute__((aligned(16))) a[4]={1.2f,3.5f,1.7f,2.8f};

VC:

__declspec(align(16)) float a[4]={1.2f,3.5f,1.7f,2.8f};

3. 指令集和汇编语言的联系

1.现代操作系统绝大多数代码都是用C语言写的,只有少量直接和硬件打交道的代码是用汇编语言写的。把操作系统源代码转换成cpu对应的机器码(指令)那是编译器和汇编器的事。
2.至于你问“利用指令集吗?”,我就不懂了。你不运行指令,怎么操纵cpu呢?你运行的指令当然就是指令集里的指令了,否则cpu也不认识啊,是不是?
3.指令和汇编语言有什么联系那是汇编器的事情。汇编语言是一类编程语言,而cpu能执行的只有指令,汇编语言通过汇编器的编译能生成指令(机器码)。问这个问题和问“C语言和exe文件有联系吗”答案是一样的。当然,不同的汇编器规定的汇编语言的格式不同。就拿intel80x86来说,
cmp dword ptr [ebp-8],0(microsoft格式)和cmpl $0,-8[%ebp](Gnu格式)
两句就是按照不同的汇编器规定的格式写的,但是他们在对应的汇编器上生成的机器码(指令)是一样的。也许哪一天我做了一个汇编器,就又有了一种别的格式的汇编语言呢。
4.操作系统的API是操作系统提供给用户的编程接口,是操作系统的一部分,什么叫“和指令集有联系?”。我认为这个问题和2中所问的是同一个问题
以上是我的回答,不知有没有说清楚……

4. 编译器与指令集

1.tc是16位的编译器,它用于64位的程序开发。自然没有对新的64位指令集支持。

2.楼主的理解有一些偏差:如同楼上所说,C语言是本地编译和链接的,此次编译链接成的可执行文件时针对本地机。其跨平台是在可用一个源文件在多平台编译链接,但是其产生的目标文件和本地不同。
TC已经过时N久了,推荐楼主使用微软的VS2008。

5. 编程怎么支持最新指令集,老的编译器如TC对新的64位指令集支持吗

1.tc是16位的编译器,它用于64位的程序开发。自然没有对新的64位指令集支持。

2.楼主的理解有一些偏差:如同楼上所说,C语言是本地编译和链接的,此次编译链接成的可执行文件时针对本地机。其跨平台是在可用一个源文件在多平台编译链接,但是其产生的目标文件和本地不同。
TC已经过时N久了,推荐楼主使用微软的VS2008。

6. 程序是通过编译器编译才能执行的,那么编译器又是怎么

一般来说,程序语言的编译有两个变量,一个是语言本身的语法体系,另外一个是目标机器的指令集体系结构。
对于前者,我们要发明一个新的编程语言的时候,一般是用已有的编程语言写新语言的编译器;
对于后者,要进行交叉编译,即在A指令集的计算机上编译B指令集计算机要用到的二进制程序。
本质上是一个鸡生蛋蛋生鸡的问题。
然而还是会绕到最终的问题:最最开始的第一只鸡(蛋(编译器))哪里来的?
当然是拿汇编语言写的啦~
那第一个汇编语言的汇编器是怎么写的?当然是直接手写二进制代码啊。。。

7. 正常编写的c语言程序编译器会自动进行针对特定指令集用汇编语言优化吗

这个要看你使用什么编译器了。查看编译器的帮助文档,它会告诉你它支持那些指令集,并且做哪些可能的优化。

不同的编译器,是不一样的。

补充:GCC 不太清楚,你连VC++的版本都不说。汗,VC6是不支持SSE的,需要安装VC6SP5。
VS2005 和 VS2008 都支持 SSE。对 SSE/MMX 指令集优化得最好的,还是 Intel 的 c++ 编译器。

对并行和高性能计算,Fortran 的优势比较大。特别是 Fortran2003 的新特征,为并行计算做了很多专门的设定。Intel 也有 Fortran 的编译器。

8. 编译器如何将编程语言翻译成目标CPU的特定指令集

编译器如何将编程语言翻译成目标CPU的特定指令集?
MSIL
MSIL是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成Microsoft 中间语言 (MSIL),它是一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。由于公共语言运行库支持多种实时编译器,因此同一段msil代码可以被不同的编译器实时编译并运行在不同的结构上。从理论上来说,MSIL将消除多年以来业界中不同语言之间的纷争。在.NET的世界中可能出现下面的情况一部分代码可以用EFFIL实现,另一部分代码使用C#或VB.NET完成的,但是最后这些代码都将被转换为中间语言。

9. 关于cpu指令集和编译器的问题

这是因为你所说的这种程序是运行在操作系统上的,它不是直接和硬件通信,真正和硬件通信的是操作系统,或者说是驱动程序,这就是不同的硬件要装不同驱动的原因,这中间还有一层bios,而windows把许多硬件的驱动都集成在系统里,所以即使你不安装驱动,系统也可以匹配很多硬件。
而系统提供了统一的应用程序入口,常见的应用程序实际上是运行在一个层层封装的统一平台上,所以同样的系统对应用程序来说仅仅要求能运行的话,就基本不用考虑硬件差异了,当然这也不是绝对的。你要是搞嵌入式开发可就没这么惬意了

10. 为什么同一款软件在不同指令集的CPU上运行相同的结果操作系统和编译器在其中起到了什么作用

软件是较高的层次,它告诉cpu具体的运算内容,cpu指令集是更底层的,它接受指令运算并输出结果,就像不同厂家的电视机,虽然内部电路不一样,但输出的图像时一样的,
当然由于指令集不同运行效率等细节上还是有差别但不影响结果!
操作系统就是管理各软件的,及管理软件运行所需要的软硬件资源,编译器是应用程序(软件)和操作系统的桥梁,操作系统通过编译器制定软件要干什么,才能调用相关资源使其运行起来!

热点内容
编译器的制作环境 发布:2025-02-06 05:54:34 浏览:828
学车网源码 发布:2025-02-06 05:47:40 浏览:385
搭建局域网影院服务器 发布:2025-02-06 05:47:38 浏览:759
广东一区cf刷经验房密码都是什么 发布:2025-02-06 05:46:20 浏览:633
加密工具源码 发布:2025-02-06 05:44:52 浏览:13
笔记本可用存储多大 发布:2025-02-06 05:44:48 浏览:157
ftp登录后没有反应 发布:2025-02-06 05:29:41 浏览:175
linux建目录命令 发布:2025-02-06 05:29:06 浏览:724
安卓所有照片在哪里 发布:2025-02-06 05:16:32 浏览:972
l2缓存作用 发布:2025-02-06 05:15:02 浏览:291