㈠ 编译器内部使用了哪些技术
编译器是一种将高级语言代码转换为机器语言代码的工具。在编译器内部,使用了许多技术来实现代码的转换和优化。
其中一些常见的技术包括:
词法分析器(Lexer):将源代码转换为一个个标记(Token),并去除无用的空格和注释。
语法分析器(Parser):将标记转换为抽象语法树(AST),并举隐检查语正虚厅法是否正确。
语义分析器(Semantic Analyzer):对AST进行分析,检查变量、函数、类型等是否符合规范,并进行类型检查等操作。
优誉早化器(Optimizer):对生成的机器语言代码进行优化,以提高代码的执行效率和空间利用率。
代码生成器(Code Generator):将优化后的代码生成可执行的机器语言代码。
调试器(Debugger):用于调试生成的代码,可以在代码执行过程中进行断点调试、变量监视等操作。
编译器内部使用这些技术,可以提高代码的执行效率、减少代码出错的概率,并方便程序员进行调试和维护。
码字不易,希望能帮到您! 求采纳...
㈡ RISC技术有什么特点
RISC的英文全称是Reced Instruction Set Computer,中文是精简指令集计算机,它的指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。其技术特点:
1、大多数指令在单周期内完成
2、采用LOAD/STORE结构。因为访问存储器指令所需要的时间比较长,在指令系统中要尽量减少这类指令,所以RISC指令中只保留不可再少的LOAD/STORE两种存储器访问指令
3、硬布线控制逻辑。使得大多数指令在单周期内执行完成,以减少为程序技术中的指令解释开销
4、减少指令和寻址方式的种类
5、固定的指令格式
6、译码优化
7、面向寄存器结构
8、注重提高流水线的执行效率,尽量让减少流水线断流,提高流水线效率
9、优化编译技术
(2)重定位编译的关键技术扩展阅读
RISC中的关键技术
1、延时转移技术
在RISC处理机中采用流水线工作方式,取指令和执行指令并行工作,那么当遇到条件转移指令时,流水线可能断流。为了尽量保证流水线的执行效率,在转移指令之后插入一条有效的指令,而转移指令好像被延时了,这样了技术即为延迟转移技术。通常指令序列的调整由编译器自动进行。需要注意的是:调整指令序列是不能改变原有程序的数据关系;被移动的指令不破坏机器的条件码。
2、指令取消技术
由于采用指令延迟技术中,遇到条件转移指令时,调整指令序列比较困难,采用了指令取消技术。所有转移指令和数据变换指令都可以决定待执行指令是否应该取消。为了提高执行效率,采用取消规则为:如果向后转移(转移的目标地址小雨当前程序计数器PC值),则转移不成功时取消下一条指令,否则执行下一条指令;如果向前转移,则相反,在转移不成功时执行下一条指令,否则取消。
3、重叠寄存器窗口技术
由于RISC的指令系统比较简单,通常采用一段子程序来实现。因此RISC中的CALL和RETURN非常多,而且都需要通过堆栈操作保存前一过程指针、数据等。为了尽量减少因为CALL和RETURN操作访问存储器的量,提出了重叠寄存器窗口技术。基本思想:在处理器中设置一个数量较大的寄存器堆,并划分成窗口。每个过程使用其中的三个窗口和一个公共窗口,而在这些窗口中有一个窗口式前一个过程公用的,还有一个窗口是与后一个过程共用。与前一过程公用的窗口可以用来存放前一过程传递被本过程的参数。
4、指令流水调整技术
为了保持指令流水线高效率,不断流,优化编译器必须分析程序的数据流和控制流。当发现指令有断流可能时,要调整指令顺序。有些可以通过变量重命名来消除的数据相关,要尽量消除。例如:
ADD R1,R2,R3; (R1)+(R2)->R3
ADD R3,R4,R5; (R3)+(R4)->R5
MUL R6,R7,R3; (R6)*(R7)->R3
MUL R3,R8,R9; (R3)*(R8)->R9
调整指令后
ADD R1,R2,R3;
MUL R6,R7,R0;
ADD R3,R4,R5;
MUL R0,R8,R9;
调整指令后,速度可以提高一倍。
5、硬件为主固件为辅
指令系统采用为程序实现的优点:便于实现复杂指令,便于修改指令系统,增加机器的灵活性,但是速度慢。所以RISC一般采用硬件为主固件为辅的方法实现指令。
㈢ 什么是重定位重定位有哪几种类型2为什么要进行重定位
1.什么是重定位?由于一个作业装入到与其地址空间不一致的存储空间,对有关地址部分的调整过程称为重定位。2.重定位有哪几种类型?分为静态重定位和动态重定位两种类型。3.为什么要进行重定位?我们写正常程序的时候根本不用去关心变量(常量)的位置,因为源程序在编译的时候它的内存中的位置郡被计算好了。程序装入内存时,系统不会为它重定位。我们需要用到变量 (常量)的时候直接用变量名访问它就行了。有的程序不可避免也要用到变量 (常量),各个变量 (常量)在内存中的位置自然也不相同。既然这些变量没有固定的地址,那么程序在运行的过程中只有重定位,才可以正常地访问相关资源。
㈣ 如何用代码实现动态重定位
重定位过程和方法
3.1 nor flash启动-----只重定位 .data
为了实现修改,我们考虑将g_char保存在外部的sdram中,修改Makefile如下:
all:
arm-linux-gcc -c -o led.o led.c
arm-linux-gcc -c -o uart.o uart.c
arm-linux-gcc -c -o init.o init.c
arm-linux-gcc -c -o main.o main.c
arm-linux-gcc -c -o start.ostart.S
arm-linux-ld -Ttext 0 -Tdata 0x30000000 start.o led.ouart.o init.omain.o -o sdram.elf
arm-linux-obj -O binary -Ssdram.elf sdram.bin
arm-linux-objmp -D sdram.elf> sdram.dis
clean:
rm *.bin *.o *.elf *.dis
编译之后,发现bin文件为800多M,显然这是不合理的
BIN文件的数值为什么是805306369?我们发现姿兆805306369=0x30000001,的确,我们在Makefile中就是指明了全局变量保存在SDRAM中,所以BIN文羡迟件的保存地址是从0~0x30000000,其大小正好是0x30000001,因此,这个时候,我们的代码段和数据段的存储格式如下:(中间产生了巨大的空洞hole)
为了解决上面的方法,代码过大的问题,有两种方式来解决:
A. 将data段重定位到SDRAM中,text段仍在迹派租NOR Flash中
1. 仍然将全局变量数据段和代码段烧写到nor flash中
2. 在运行时,代码段代码要能实现将数据段拷贝(重定位)到SDRAM中;
3. 以后每次访问全局变量,都是去SDRAM中去访问,不去nor flash中访问
㈤ 什么是重定位,重定位的原理
编译时候的重定位,编行橡圆译原理里有档塌的.也就是说,编译好的文件,变如谨量等都有个相对地址,在运行的时候,需要重定位到真正的内存地址,一般需要重定位的地址,在EXE文件中都有标记的.
㈥ 编译器开发的四种技术
编译程序的开发常常采用这四种:自编译、交叉编译、自展和移植等技术实现。
㈦ 举例说明病毒如何重定位
病毒的生存空间就是宿主程序,而因为宿主程序的不同。所以病毒每次插入到宿主程序中的位置也不同。那么病毒需要用到的变量的位置就无法确定。所以这就是病毒首先要重定位的原因。在我们编写程序的时候,所用到的变量的位置都是相对与程序某一个位置的偏移,正常的程序加载的地址是唯一的,所以它们不需要重定位。而病毒的加载是随机的所以就有了重定位的过程。虽然加载的位置不一定,但是变量到某一个位置的偏移却是固定的。所以重定位的基本原理就是找到这个特殊的位置。具体的方法有很多种。这里说几种常见的。
一、重定位的原因
都说病毒第一步要重定位,那到底为什么要重定位呢?我们写正常程序的时候根本不用去关心变量(常量)的位置,因为源程序在编译的时候它的内存中的位置郡被计算好了。程序装入内存时,系统不会为它重定位。我们需要用到变量 (常量)的时候直接用变量名访问它就行了。
病毒不可避免也要用到变量 (常量),当病毒感染HOST程序后,由于其依附到HOST程序中的位置各有不同,病毒随着HOST载入内存后病毒中的各个变量 (常量)在内存中的位置自然也不相同。既然这些变量没有固定的地址,病毒在运行的过程中应该如何引用这些变量呢尘核?所以,病毒只有自己帮助自己重定位,这样就可以正常地访问自己的相关资源了。
二、如何重定位
大家都知道CALL是一条函数调用指令,也可以当成是跳转指令。它可以跳到目的地址继续执行,执行完毕后,会返回到主程序继续执行。那系统如何知道返回地址的呢?当CALL执行时,CPU首先把要返回的地址 (即下一条指令的地址)压火堆栈,然后跳到我们目的地址执行。可以看出,在跳转之后只要执行一条POP指令或MOVEXX,[ESP]就可以得到下一条指令在内存中的实际位置了。其实,对于任何一个变量,我们都可以采用这种方式进行重定位。
好了,原理都讲完了,现在让我们厅缺总结一下重定位的基本步骤 (这里假设下一条指令为I1):
(1)用CALL指令跳转到下一条指令,使I1在内存中的实际地址进栈。
(2)用POP或MOV EXX,[ESP]取出栈顶的内容,这样就得到了I1的地址 (BaSe)。
(3)其他指令 (变量、常量)的实际地址就等于Base+(0ffSetLabe1-OffSet vstart)。
三、实例说明
现在,就让我们看一下重定位的具体代码。
这里VStart这个标号的位置就是I1的位置了。下面看看代码是怎么实现的:Ca1lVStart跳到vStart,然后pop ebX把堆栈顶端的内容 (即VStart在内存中的地址)放到ebx。这样。以后用到其他变量的时候就可以用ebX+(OffSet XXX-OffSet VStart)得到其在内存中的真正偏移地址了。
call vstart
vstart:
pop ebx ;定义为I1指定
下面再具体一点。譬如我们想取变量abc的内容时,则可先取地址到esi中,然后使用 "mov eax,[esi]"指令即可得到abC的内容。
abc dd 0
...
call vstart
vstart:pop ebx
...
lea esi,[ebx+(abc-vstart}]
上面我们提到偏移地址可以通过ebx+(Offset XXX-OffSet VStart)计算得到。我们通常也可以看到如下重定位方式:
abc dd.0
...
call vstart
vstart:
pop ebx
sub ebx,offset vstart
...
mov eax,[ebx+abc]
其实这和上面那种方法最终结果是一样的,只不过是换了一种形式,即 (ebX-0ffSetVStart)+OffSet XXX。另外,扮兄辩在实际过程中还会碰到其他重定位方式,并且需要重定位的绝对不仅局限于变量和常量,不过所有原理都是一样的。
㈧ 重定位的时机
将逻辑地址空间重定位到物理地址空间的时机有三种:
1、程序编译连接时。
2、程序装入内存时。
3、程序执行时。
重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程。它是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位。
分类
对程序进行重定位的技术按重定位的时机可分为两种:静态重定位和动态重定位。
静态重定位:是在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址都改成实际的地址。对每个程序来说,这种地址变换只是在装入时一次完成,在程序运行期间不再进行重定位。
动态重定位:是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化。
㈨ 重定位是什么意思
一、定义:重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程.他是实现多道程序在内存中同时运行的基础.重定位有两种,分别是动态重定位与静态重定位
二、分类
1、静态重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定悉腊位,地址变换通常是饥陆弯在装入时一次完成的,以后不再改变,故成为静态重定位.
2、动态重定位:它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址.动态重定位需要软件和硬件相互配合完成.
三、时机
将逻辑地址空间重定位到物理地址空间的时机有三种:
1、程序编译连接时.
2、程序装入内存时.
3、程序执行时.
四、扩展阅读:
重定位是由操作系统安排的.
在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址.在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位.
重定位与EXE文件无关,它是程序装入时的一种方式.利用重烂闷定位可提高内存空间的使用率.
㈩ C语言编译执行的全过程是怎样的
不明白楼主什么意思,就是先把你的代码转为汇编代码,然后转为二进制文件,读入内存执行。