int main() {
int a, b;
int c = a && b;
int d = a || b;
return 0;
}
这样的一段非常简单的程序,编译器一般会如何实现它呢?
首先,x86架构的CPU没有逻辑与和逻辑或的指令,那么,对于逻辑与和逻辑或,编译器会如何将其转换为x86指令集下的指令序列呢?
使用gcc -S命令产生了编译产生的汇编代码。我通过在其中添加一些C风格的注释,帮助大家理解这段简单的代码。
.file "logic.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp //此时ebp寄存器保存了栈顶指针的位置(声明局部变量前)
.cfi_def_cfa_register 5
subl $16, %esp //栈顶指针上移16字节,即申请四个int类型变量的栈空间
cmpl $0, -4(%ebp) //-4(%ebp)为变量a,比较变量a与立即数0
je .L2 //如果相等则跳转到L2
cmpl $0, -8(%ebp) //否则比较变量b与立即数0
je .L2 //如果相等则跳转到L2
movl $1, %eax //否则eax寄存器设为1
jmp .L3 //跳转到L3
.L2:
movl $0, %eax //eax寄存器设为0
.L3:
movl %eax, -12(%ebp) //结果保存到变量c(下面是或运算的部分了)
cmpl $0, -4(%ebp)
jne .L4
cmpl $0, -8(%ebp)
je .L5
.L4: //a不为0则会走到这里
movl $1, %eax //设定eax为1
jmp .L6
.L5: //a、b均为0则会走到这里
movl $0, %eax //设定eax为0
.L6:
movl %eax, -16(%ebp) //结果保存到变量d
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.6.1 20110908 (Red Hat 4.6.1-9)"
.section .note.GNU-stack,"",@progbits
从这个汇编代码中就体现了C语言逻辑运算的截断特性。即对于与操作,第一个0的出现表示整个合取式为0;对于或操作,第一个1的出现表示整个析取式为1。那么,当我们在写逻辑运算表达式的时候,如果可能的话,应当考虑每个项为真或为假的概率,例如,在一个合取式a && b当中,b为0的概率比a为0的概率大得多,那么我们用b && a来代替a && b是可以起到提高效率的作用的。
有些时候代码的优化工作会由编译器完成,不过,对于变量取值可能性的估计,编译器大多数情况是无法做到的,因此,在这种情况下,我们还是应该尽量人工完成这部分优化工作。
分享到:
相关推荐
这本书作为入门指南,将带领读者逐步探索C语言的魅力,为后续的软件开发或系统级编程打下坚实的基础。通过阅读《啊哈C语言!逻辑的挑战(修订版)》,初学者不仅可以掌握C语言的基本语法,还能培养出良好的编程思维...
中间代码生成是编译过程中的重要环节,它将源代码转换为一种与目标机器无关的表示形式,如三地址码或虚拟机指令。这样做的好处是可以进行通用的优化,而不必考虑特定的硬件架构。 随后,代码优化器对中间代码进行...
【标题】:“Turboc2 C语言编译模拟器”是一款经典的C语言开发工具,它集成了编译器和模拟器功能,为程序员提供了一个高效、便捷的编程环境。Turbo C 2.0是Borland公司推出的一个早期版本,它在当时因其轻量级、快速...
在这个主题中,我们主要关注C语言编译器的构建,这是一种用C语言实现对C语言子集的编译程序的过程。这个过程通常包括三个关键步骤:词法分析、语法分析和语义分析。 首先,词法分析(也称为扫描或标记)是编译器的...
由于它的通用性和效率,C语言编写的程序经常被编译为二进制格式,而这个工具就是为了那些需要查看或修改这些二进制代码的人设计的。 “EXE_TO_C”这个压缩包子文件的文件名称暗示了这个工具可能的工作流程:接受一...
【C语言函数中的逻辑结构】在C语言编程中,函数是一种重要的组织代码的方式,它允许我们将复杂的任务分解为更小的、可管理的部分,每个部分都有特定的功能。本课程聚焦于C语言中的函数,旨在帮助学习者理解并掌握...
这种方法的优势在于,C语言代码可以在多种硬件平台上编译运行,而且执行效率高,非常适合嵌入式系统。具体实现过程如下: 1. **构建模糊推理系统**:首先,需要利用MATLAB或其他设计工具构建一个模糊推理系统(FIS...
根据提供的文件内容,可以看出文件是关于C语言编程习题的解答,使用了C++语言进行编写,并且指定在Visual Studio 2010环境下进行编译。下面将详细说明文档中的各个知识点: ### 一、开发环境和语言说明 - **编译...
8. **调试与测试**:编写好DLL后,需要在C语言环境中进行单元测试,确保函数逻辑正确。然后在易语言环境中调用这些函数,进行集成测试,确保两者间的通信无误。 9. **动态加载与卸载**:易语言调用DLL时,可以动态...
TC,全称Turbo C,是由Borland公司开发的一款著名的C语言编译器,尤其在80年代末90年代初,它在个人...对于初学者来说,通过使用Turbo C,可以更好地理解C语言的基本语法和编程逻辑,为后续深入学习打下坚实的基础。
表达式(expression)是C语言的核心,包括赋值表达式(assignment_expression)、条件表达式(conditional_expression)和逻辑运算表达式(logical_or_expression)。赋值表达式涉及到赋值操作符(assignment_...
标准的C语言编译器有GCC(GNU Compiler Collection)和Microsoft Visual C++等,但这些通常需要通过命令行或更复杂的IDE来操作。这款小工具可能是为了简化这个过程,提供了直观的图形用户界面(GUI),让初学者也能...
从给定的文件标题“现代编译原理-c语言描述”以及描述中,我们可以提炼出关于编译原理在C语言中的应用的关键知识点。虽然文件的部分内容似乎包含了一些编码错误或者非文本字符,但根据标题和描述,我们可以围绕C语言...
总之,本项目提供的“C语言词法分析程序”旨在让学生或开发者深入理解编译原理,通过实际操作学习词法分析的过程。这不仅有助于提升编程技能,也能增强对底层语言机制的理解,为将来设计更复杂的编译器或解析器打下...
10. **编译与调试**:使用VC6进行编译时,需要注意设置正确的编译选项,如选择合适的编译器版本、配置目标平台等。调试工具可以帮助开发者定位和修复程序中的错误。 总结来说,"C语言编译贪吃蛇游戏"是一个结合了...
总的来说,这个"PL0 C语言版 编译原理"项目是一个实用的教学资源,它让学习者能够亲手构建一个小型的编译器,从而深入理解编译器的内部工作机制。通过研究和调试这个C语言实现的PL0编译器,不仅可以掌握编译技术,还...
编译原理词法分析器源程序C语言实现 本资源是一个使用C语言实现的编译原理词法分析器源程序,主要功能是对输入的源程序进行词法分析,识别出关键字、标识符、数字等 token,并将其输出。 1. 编译原理 编译原理是...
本资源提供了用C语言实现的语义分析器,它专注于解析C语言的部分语法结构,并将其转化为三地址代码,这是一种中间表示形式,通常用于编译过程的优化阶段。 首先,我们要了解什么是语义分析。在编译过程中,词法分析...
编译过程中,如果出现语法错误或逻辑错误,编译器会给出相应的错误提示,帮助用户定位并修复问题。 "说明.txt"文件可能包含了关于如何安装和使用VC++6.0的详细步骤,以及可能遇到的一些常见问题和解决方案。对于...
本文将深入探讨“C语言小子集编译程序”的实现过程,包括词法分析、语法分析、语义分析和目标代码生成等关键步骤。 首先,我们要了解编译器的工作原理。编译器是将高级语言(如C语言)转化为机器可执行的低级语言...