1. 关于cpu指令集和编译器的问题
这些软件在编写时也考虑到了这点,所以用兼容的方式是可以运行的,当然,在优化过的程序(与指令集最匹配)中肯定会获得较好的运行效率。
个人观点,不够专业,仅供参考!
2. 指令集、编译器、算法、CPU
CPU就是用来计算的,CPU可以做不同的计算,每种计算是一个命令,你可以用命令通知CPU做这种计算,所有的命令构成了指令集。
你写的代码CPU是不懂的,需要翻译成上面说的命令,这个翻译者就是编译器。
算法跟他们的关系稍远一些。如果把计算比作生产的话,那算法就是配方和工艺,指导着从原材料到产品的生产过程。
希望能帮助到你。
3. 伪指令的原理
不要感到迷惑,伪指令是帮助编译程序编译而设置的指令,作用五花八门。
比如段描述符可以指定段起始边界值,段模块化组合属性。数据和变量定义也是用到的伪指令。
这分两个方面,一是我们的程序不只存在机器码,它必须有一些人为规定的文件格式信息,程序之中用到的数据和变量,这些CPU并不执行的东西,然而又是程序所必须的。
还有一个方面,就是编译器在编译的时候需要知道一些预处理命令。不要认为编译器是万能的,实际上写编译器极其复杂,国内也没有几个公司做外包编译器的。编译器经过几遍词法扫描,句法分析等等,中间还要经过临时用堆栈和表格存储,最终才将编译完成。为什么规定汇编立即数的第一个数不能为字母?因为这样可以让编译器省很多事情。
至于assume,也许只有阅读masm的帮助文档才能真正知道它在编译中起到的作用。一个段假如 assume es:XX
那么在这个段里 mov ax,[bx]实际上就会自动编译成mov ax,es:[bx]
如果你有兴趣,着名的《编码的奥秘》和《编译原理》两本书将使你茅塞顿开。
我以为难得休息够早了,没想到各位居然。。。
4. 指令译码器是做什么的
指令译码器(Instruction Decoder,ID)是控制器中的主要部件之一。计算机能且只能执行 "指令"。指令由操作码和地址码组成。操作码表示要执行的操作性质,即执行什么操作,或做什么;地址码是操作码执行时的操作对象的地址。计算机执行一条指定的指令时,必须首先分析这条指令的操作码是什么,以决定操作的性质和方法,然后才能控制计算机其他各部件协同完成指令表达的功能。这个分析工作由译码器来完成。 指令执行通过控制部件进行指令译码,标量指令由标量处理机执行向量指令各Cache控制器监听总线所有操作,并对操作做相应处理(修改或作废),如MESI协议。
指令
计算机指令通常由操作码和地址码两部分组成:
操作码:指明计算机执行的某种操作的性质和功能;
地址码:指出被操作的数据(简称操作数)存放在何处,即指明操作数地址,有的指令格式允许其他地址码部分就是操作数本身。
译码器
译码器是组合逻辑电路的一个重要的器件,其可以分为:变量译码和显示译码两类。
变量译码:一般是一种较少输入变为较多输出的器件,一般分为2n译码和8421BCD码译码两类。
显示译码:主要解决二进制数显示成对应的十、或十六进制数的转换功能,一般其可分为驱动LED和驱动LCD两类。
译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义“翻译”出来的过程叫做译码,实现译码操作的电路称为译码器。或者说,译码器是可以将输入二进制代码的状态翻译成输出信号,以表示其原来含义的电路。
根据需要,输出信号可以是脉冲,也可以是高电平或者低电平。
过程
计算机执行指令时,从内存中取出的一条指令经数据总线送往指令寄存器中。指令的操作码被送到指令译码器中译码,地址码则送到地址形成部件。地址形成部件根据指令特征将地址码形成有效地址,送往主存的地址寄存器。对于转移指令,要将形成的有效转移地址送往程序计数器中,实现程序的转移。操作控制器根据指令译码器对于指令操作码的译码,产生出实现指令功能所需要的全部动作的控制信号。这些控制信号按照一定的时间顺序发往各个部件,控制各部件的动作。
5. C语言编译器与cpu中指令编译器的区别
一个是软件,一个是硬件。完全不一样的东西。
6. c语言的编译与处理器的指令集有关吗一定要CISC吗RISC可不可以
C语言只是用于描述问题和算法的一种语言,而在实际机器上真实运行的却是各处理器自己的机器指令。编译器的工作就是将C语言翻译为机器指令。对你的问题答复如下:1. C语言与指令系统没有关系,但是编译器翻译的指令与指令系统有关系;2.无论CISC还是RISC,编译器都可以将C语言翻译为对应的机器指令。
7. 汇编指令、编译器和CPU的问题
x86的指令集基本是向上兼容的,在新cpu上运行老代码是可以的。
如果是全新的指令集,cpu厂家在设计时就会有指令集和汇编程序了,现在一般厂商至少提供c语言编译程序。
如果自己开发编译程序,前端(词法分析到中间代码生成)一般不用动,后端是要自己写的。
8. 程序是通过编译器编译才能执行的,那么编译器又是怎么
一般来说,程序语言的编译有两个变量,一个是语言本身的语法体系,另外一个是目标机器的指令集体系结构。
对于前者,我们要发明一个新的编程语言的时候,一般是用已有的编程语言写新语言的编译器;
对于后者,要进行交叉编译,即在A指令集的计算机上编译B指令集计算机要用到的二进制程序。
本质上是一个鸡生蛋蛋生鸡的问题。
然而还是会绕到最终的问题:最最开始的第一只鸡(蛋(编译器))哪里来的?
当然是拿汇编语言写的啦~
那第一个汇编语言的汇编器是怎么写的?当然是直接手写二进制代码啊。。。
9. 汇编器和编译器有什么区别
汇编器(Assembler)是将汇编语言翻译为机器语言的程序。一般而言,汇编生成的是目标代码,需要经链接器(Linker)生成可执行代码才可以执行。
汇编语言是一种以处理器指令系统为基础的低级语言,采用助记符表达指令操作码,采用标识符表示指令操作数。作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。常用的高级语言编译器有Microsoft公司的MASM系列和Borland公司的TASM系列编译器,还有一些小公司推出的或者免费的汇编软件包等。
编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)
10. 编译器与指令集
1.tc是16位的编译器,它用于64位的程序开发。自然没有对新的64位指令集支持。
2.楼主的理解有一些偏差:如同楼上所说,C语言是本地编译和链接的,此次编译链接成的可执行文件时针对本地机。其跨平台是在可用一个源文件在多平台编译链接,但是其产生的目标文件和本地不同。
TC已经过时N久了,推荐楼主使用微软的VS2008。