第4章linuxc编程

第4章linuxc编程

ID:33456735

大小:303.01 KB

页数:19页

时间:2018-05-25

第4章linuxc编程_第1页
第4章linuxc编程_第2页
第4章linuxc编程_第3页
第4章linuxc编程_第4页
第4章linuxc编程_第5页
资源描述:

《第4章linuxc编程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第4章LinuxC编程LinuxGCC编译器基本原理LinuxGDB调试技术Linuxmakefile项目管理本章要点4.1C程序编译流程4.1.1主要步骤编译程序读取源程序(字符流);对源程序进行词法和语法分析;将高级语言指令转换为等效的汇编代码;将汇编代码转换为机器语言;按照操作系统对可执行文件格式的要求链接生成可执行程序。预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)test.ctest.itest.itest.stest.otest可执行格式test.stest.o预处理(Pre-P

2、rocessing)读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理伪指令主要包括以下3个方面:(1)头文件包含指令:如#include“user.h”或者#include等。采用头文件是为了使某些定义可供多个不同的C源程序使用,在需要用到这些定义的C源程序中,只需加上#include语句即可,而不必再在此文件中将这些定义重复一遍。预处理程序将把头文件中的定义展开到它所产生的输出文件中,以供编译程序对之进行处理。系统头文件:#include<*.h>用户头文件:#include"*.h"(2)宏定义指令:如#defineNameTo

3、kenString等,预编译所要做的是将程序中的所有Name用TokenString替换。(3)条件编译指令:如#ifdef、#ifndef、#else、#elif、#endif等。这些伪指令使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。特殊符号:预处理程序可以识别的一些符号,例如:在源程序中出现的LINE标识将被解释为当前行号(十进制数);FILE则被解释为当前被编译的C源程序的名称。预处理程序对于在源程序中出现的这些串将用合适的值进行替换。预处理程序所完成的基本上是对源程序的“替代”工作。经

4、过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成汇编指令。编译(Compiling)经过预处理得到的输出文件中,将只有常量。如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,},+,-,*,,等。编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。Linux下的ATT汇编ATT汇编与INTEL汇编语法比较:1

5、指令大小写INTEL格式的指令使用大写字母,而ATT格式的使用小写字母。例:INTELATTMOVEAX,EBXmovl%ebx,%eax2指令操作数赋值方向INTEL格式中,第一个为目的操作数,第二个为源操作数,赋值方向从右向左;ATT格式中,第一个为源操作数,第二个为目的操作数,方向从左到右。例:INTELATTMOVEAX,EBXmovl%ebx,%eax3指令前缀INTEL格式中寄存器和立即数不需要前缀;ATT格式中寄存器需要加前缀“%”;立即数需要加前缀“$”。例:INTELATTMOVEAX,1movl$1,%eaxATT格式中:符号常数直接引用,不需要

6、加前缀,如:movlvalue,%ebx//value为一常数;在符号前加前缀$,表示引用符号地址,如:movl$value,%ebx//将value的地址放到ebx中。远程跳转指令和子过程调用指令的操作码使用前缀“l“,分别为ljmp,lcall。例:INTEL               ATTJMPFARSECTION:OFFSETljmp$secion,$offsetRETFARSATCK_ADJUSTlret$stack_adjust4指令后缀ATT格式中大部分指令操作码的最后一个字母表示操作数大小,“b”表示byte(一个字节)“w”表示word(2,个

7、字节)“l”表示long(4,个字节)。INTEL中处理内存操作数时也有类似的语法如:BYTEPTR、WORDPTR、DWORDPTR。例:INTELATTmoval,blmovb%bl,%almovax,bxmovw%bx,%axmoveax,dwordptr[ebx]movl(%ebx),%eax符号"."表示汇编代码的当前地址,例:.align4//以下所有代码以4字节对齐.byte97//在当前位置分配内存空间,存放ASII码"97",即字母a.int123,23,54//在当前位置分配内存空间,依次存放"123""23""54".text//标识代码段

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。