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是可以起到提高效率的作用的。
有些时候代码的优化工作会由编译器完成,不过,对于变量取值可能性的估计,编译器大多数情况是无法做到的,因此,在这种情况下,我们还是应该尽量人工完成这部分优化工作。
分享到:
相关推荐
编译环境为Visual Studio 2010,所用语言为C++,与书中逻辑相通,仅仅输入、输出语句有所不同,每一段程序的头文件给出如下,编译时,复制即可。
3.C语言流程控制,分支,顺序,循环逻辑控制 4.函数概述与引用,简单递归,简单嵌套,C语言调用函数示例 5.数组,二维数组,高维数组,详细案例 6.指针,指针与地址,指针与数组,指针与字符串,指针与函数,多重...
编译原理C语言子集词法分析器 编译原理中的C语言子集词法分析器是一个简化版的词法分析器,它只识别和处理C语言的一个子集。这样的分析器通常用于教学目的,帮助学生理解词法分析的基本概念和实现方法。以下是一个...
C语言,Java语言,编译原理,操作系统,高数,计算机网络实用技术,数据结构,数据库及应用,数字逻辑,微机原理,应用选讲复习题包 各一份 doc格式
结构清晰:C语言采用结构化编程思想,有助于培养学生的逻辑思维能力和程序设计能力。通过C语言的学习,学生可以掌握如何合理组织代码、设计算法和数据结构。 资源丰富:C语言拥有丰富的学习资源和社区支持,包括...
完成一个相对完整的编译器,该编译完成对变量类型(整数/浮点数)定义、赋值、四则运算、逻辑运算、跳转与循环控制功能。其输入是源程序(参见“一个四则运算源程序示例”),输出是所有变量的最终值。
2、内含测试程序,在Linux环境下进入目录后make即可编译,已经在ubuntu16.04环境下编译测试OK; 4、已经在扫码POS认证中得到应用,解析出证书的序列号、公钥; 5、漂亮的解析ASN1(TLV数据格式)算法及完整解析X509...
4.3.2 用项目管理多文件程序的编译与链接过程 4.3.3 头文件 4.4 宏定义与宏替换 4.4.1 字符串宏定义及其基本格式 4.4.2 使用宏需注意的问题 4.4.3 撤销己定义的宏 4.4.4 带参数的宏定义 习题四 第5...
可供研究生复试或相关专业岗位面试使用。如: 简述C语⾔采取了哪些措施提⾼执⾏效率; ⼆维数组在物理上以及逻辑上的数组维度理解; 隐式类型转换的四种情况; 结构体对⻬规则; 指针在函数中的应用和特点; C 语言...
主要原因可能是C语言具有和汇编语言的对应性,一条C语言代码,对有经验的人来说,可以转换为一条或多条汇编代码,也就是说编译结果具有可预测性。C代码不会在被编译时被加上奇奇怪怪的修饰,也不会在二进制兼容性...
4.3.8实例13:用P0口显示逻辑“与”运算结果 4.3.9实例14:用P0口显示条件运算结果 4.3.10实例15:用P0口显示按位“异或”运算结果 4.3.11实例16:用P0口显示左移运算结果 4.3.12实例17:“万能逻辑电路”实验 ...
4.7 C语言的预处理程序与注释 67 4.7.1 C语言的预处理程序 68 4.7.2 #define 68 4.7.3 #error 69 4.7.4 # include 69 4.7.5 条件编译命令 70 4.7.6 #undef 72 4.7.7 #line 73 4.7.8 #pragma 73 4.7.9 预定义的宏名 ...
结构清晰:C语言采用结构化编程思想,有助于培养学生的逻辑思维能力和程序设计能力。通过C语言的学习,学生可以掌握如何合理组织代码、设计算法和数据结构。 资源丰富:C语言拥有丰富的学习资源和社区支持,包括...
1.10 C语言编译过程,GCC参数简介 16 1.10.1 C语言编译过程 16 1.10.2 -E预编译 16 1.10.3 -S汇编 16 1.10.4 -c编译 16 1.10.5 链接 16 1.11 操作系统结构 17 1.11.1 用户模式 17 1.11.2 内核模式 17 1.12 64位,32位...
结构清晰:C语言采用结构化编程思想,有助于培养学生的逻辑思维能力和程序设计能力。通过C语言的学习,学生可以掌握如何合理组织代码、设计算法和数据结构。 资源丰富:C语言拥有丰富的学习资源和社区支持,包括...
1 第一讲 C语言概述、数据类型、运算符和表达式 2 第二讲 数据类型、运算符和表达式 3 第三讲 简单的C程序设计 4 第四讲 逻辑运算和判断选取控制 5 第五讲 逻辑运算和判断选取控制 6 第六讲 循环控制 7 ...
A、2字节 B、4字节 C、由编译系统决定 D、由用户决定 4.运算符有优先级,C语言中关于运算符优先级的正确叙述是________。 A、逻辑运算符高于算术运算符,算术运算符高于关系运算符; B、算术运算符高于关系运算符...
自顶向下的语法制导翻译,可以生成各种类型的表达式(包括布尔,算术,逻辑等等),循环中的while,选择中的if else 和if等,功能比较强大,对于应付编译原理课程设计足足有余。此代码是本人课程设计的心血。
结构清晰:C语言采用结构化编程思想,有助于培养学生的逻辑思维能力和程序设计能力。通过C语言的学习,学生可以掌握如何合理组织代码、设计算法和数据结构。 资源丰富:C语言拥有丰富的学习资源和社区支持,包括...
4.7 C语言的预处理程序与注释 67 4.7.1 C语言的预处理程序 68 4.7.2 #define 68 4.7.3 #error 69 4.7.4 # include 69 4.7.5 条件编译命令 70 4.7.6 #undef 72 4.7.7 #line 73 4.7.8 #pragma 73 4.7.9 预定义的宏名 ...