&&逻辑运算符的汇编代码
2013-09-14 00:02
120 查看
今天去参加了一个笔试,考试的语言是C语言.下面是一个题目的内容,大致是这样的.
问的是这个打印多少,以前一直没有关心过&&表达式的值.只知道当a如果是0的时候,会直接返回假,假是0.那当a不是0,那就的看b是不是真,如果是真,那会返回什么呢?真是纠结.知道会返回真,那真到底是多少?是1还是b的值,最后我填了b的值.回来反汇编之后,发现其实这些代码的反汇编代码是这样的.实际会定义一个0和1,作为返回值.
看了汇编代码,知道了编译器是如何翻译的.下面,考虑的问题是,如果定义的c是false那又是怎么回事呢?
原来bool类型还是用一个自己来表示的,为什么不考虑用4个字节呢?这样不是字节对齐,性能更好吗?
看看release版本的程序吧!
编译器其实已经帮助我们求出了值,答案就是1.编译器做了不少的优化.
#include <stdio.h> int main( int argc, char *argv[] ) { int a = 7; int b = 10; int c = 19; c = a && b; printf( "%d.\n", c ); }
问的是这个打印多少,以前一直没有关心过&&表达式的值.只知道当a如果是0的时候,会直接返回假,假是0.那当a不是0,那就的看b是不是真,如果是真,那会返回什么呢?真是纠结.知道会返回真,那真到底是多少?是1还是b的值,最后我填了b的值.回来反汇编之后,发现其实这些代码的反汇编代码是这样的.实际会定义一个0和1,作为返回值.
#include <stdio.h> int main( int argc, char *argv[] ) { 00411390 push ebp 00411391 mov ebp,esp 00411393 sub esp,0E8h 00411399 push ebx 0041139A push esi 0041139B push edi 0041139C lea edi,[ebp-0E8h] 004113A2 mov ecx,3Ah 004113A7 mov eax,0CCCCCCCCh 004113AC rep stos dword ptr es:[edi] int a = 7; 004113AE mov dword ptr [a],7 int b = 10; 004113B5 mov dword ptr [b],0Ah int c = 19; 004113BC mov dword ptr [c],13h c = a && b; 004113C3 cmp dword ptr [a],0 004113C7 je main+4Bh (4113DBh) 004113C9 cmp dword ptr [b],0 004113CD je main+4Bh (4113DBh) 004113CF mov dword ptr [ebp-0E8h],1 004113D9 jmp main+55h (4113E5h) 004113DB mov dword ptr [ebp-0E8h],0 004113E5 mov eax,dword ptr [ebp-0E8h] 004113EB mov dword ptr [c],eax printf( "%d.\n", c ); 004113EE mov esi,esp 004113F0 mov eax,dword ptr [c] 004113F3 push eax 004113F4 push offset string "%d.\n" (41563Ch) 004113F9 call dword ptr [__imp__printf (4182B8h)] 004113FF add esp,8 00411402 cmp esi,esp 00411404 call @ILT+300(__RTC_CheckEsp) (411131h) }
看了汇编代码,知道了编译器是如何翻译的.下面,考虑的问题是,如果定义的c是false那又是怎么回事呢?
int main( int argc, char *argv[] ) { 00411360 push ebp 00411361 mov ebp,esp 00411363 sub esp,0E8h 00411369 push ebx 0041136A push esi 0041136B push edi 0041136C lea edi,[ebp-0E8h] 00411372 mov ecx,3Ah 00411377 mov eax,0CCCCCCCCh 0041137C rep stos dword ptr es:[edi] int a = 7; 0041137E mov dword ptr [a],7 int b = 10; 00411385 mov dword ptr [b],0Ah bool c = false; 0041138C mov byte ptr [c],0 c = a && b; 00411390 cmp dword ptr [a],0 00411394 je main+48h (4113A8h) 00411396 cmp dword ptr [b],0 0041139A je main+48h (4113A8h) 0041139C mov dword ptr [ebp-0E8h],1 004113A6 jmp main+52h (4113B2h) 004113A8 mov dword ptr [ebp-0E8h],0 004113B2 mov al,byte ptr [ebp-0E8h] 004113B8 mov byte ptr [c],al }
原来bool类型还是用一个自己来表示的,为什么不考虑用4个字节呢?这样不是字节对齐,性能更好吗?
看看release版本的程序吧!
#include <stdio.h> int main( int argc, char *argv[] ) { int a = 7; int b = 10; int c = 8; c = a && b; printf( "%d", c ); 00401000 push 1 00401002 push offset string "%d" (4020E4h) 00401007 call dword ptr [__imp__printf (40209Ch)] 0040100D add esp,8 return 0; 00401010 xor eax,eax }
编译器其实已经帮助我们求出了值,答案就是1.编译器做了不少的优化.
相关文章推荐
- 原代码,反码,解释和具体的补充 Java在>>和>>>差异
- 【Html】想加入一行代码吗?使用<code>标签
- 首页html代码的<head>和</head>之间的内容
- << 电子电路 >>汇编
- 基于x86的Hello World汇编代码分析(AT&T风格汇编)
- <四>--RIL层代码分析--整个电话来访过程
- <ul>中的<li>我点击一个<li>后其它的<li>全变背景色,求JS和CSS代码 <ul>中的<li>我点击一个<li>后其它的<li>全变背景色 要图中效果,求JS和CSS代码 (搜搜问问)
- 【Html】使用<pre>标签为你的网页加入大段代码
- &和&&的区别,逻辑运算符和位运算符
- <Linux+Qt>一种移植qt可执行代码的方式
- <include>标签和BaseActivity联合使用简化代码结构
- JS使用&&和||来优化代码
- &&的运算顺序和代码规范
- *谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制
- "Bilateral texture filtering"论文 matlab实现代码
- EL表达式的相关代码和jstl中的<c:if>、<c:foreach>标签
- <%%>创建内联代码块(表达)
- ">.NET代码执行效率优化
- "点击返回上一页"的代码
- 【编程之旅】一段大牛写的"奇幻代码"