您的位置:首页 > 编程语言

&&逻辑运算符的汇编代码

2013-09-14 00:02 120 查看
今天去参加了一个笔试,考试的语言是C语言.下面是一个题目的内容,大致是这样的.

#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.编译器做了不少的优化.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: