| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1712 人关注过本帖
标题:看看三目运算符?:到底是怎么回事
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
 问题点数:0 回复次数:13 
看看三目运算符?:到底是怎么回事
程序代码:
void main(void)
{
    int a = 1;
    int b = 2;
    int max;

    max = (a > b) ? a : b;
}


下面是编译得到的汇编代码:

程序代码:
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 

    TITLE    c:\Users\TonyDeng\documents\visual studio 2010\Projects\test4\test4\test.cpp
    .686P
    .XMM
    include listing.inc
    .model    flat

INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES

PUBLIC    _main
EXTRN    __RTC_Shutdown:PROC
EXTRN    __RTC_InitBase:PROC
;    COMDAT rtc$TMZ
; File c:\users\tonydeng\documents\visual studio 2010\projects\test4\test4\test.cpp
rtc$TMZ    SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ    ENDS
;    COMDAT rtc$IMZ
rtc$IMZ    SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ    ENDS
;    COMDAT _main
_TEXT    SEGMENT
tv65 = -232                        ; size = 4
_max$ = -32                        ; size = 4
_b$ = -20                        ; size = 4
_a$ = -8                        ; size = 4
_main    PROC                        ; COMDAT

; 2    : {

  00000    55         push     ebp
  00001    8b ec         mov     ebp, esp
  00003    81 ec e8 00 00
    00         sub     esp, 232        ; 000000e8H
  00009    53         push     ebx
  0000a    56         push     esi
  0000b    57         push     edi
  0000c    8d bd 18 ff ff
    ff         lea     edi, DWORD PTR [ebp-232]
  00012    b9 3a 00 00 00     mov     ecx, 58            ; 0000003aH
  00017    b8 cc cc cc cc     mov     eax, -858993460        ; ccccccccH
  0001c    f3 ab         rep stosd

; 3    :     int a = 1;

  0001e    c7 45 f8 01 00
    00 00         mov     DWORD PTR _a$[ebp], 1

; 4    :     int b = 2;

  00025    c7 45 ec 02 00
    00 00         mov     DWORD PTR _b$[ebp], 2

; 5    :     int max;
; 6    :
; 7    :     max = (a > b) ? a : b;

  0002c    8b 45 f8     mov     eax, DWORD PTR _a$[ebp]
  0002f    3b 45 ec     cmp     eax, DWORD PTR _b$[ebp]
  00032    7e 0b         jle     SHORT $LN3@main
  00034    8b 4d f8     mov     ecx, DWORD PTR _a$[ebp]
  00037    89 8d 18 ff ff
    ff         mov     DWORD PTR tv65[ebp], ecx
  0003d    eb 09         jmp     SHORT $LN4@main
$LN3@main:
  0003f    8b 55 ec     mov     edx, DWORD PTR _b$[ebp]
  00042    89 95 18 ff ff
    ff         mov     DWORD PTR tv65[ebp], edx
$LN4@main:
  00048    8b 85 18 ff ff
    ff         mov     eax, DWORD PTR tv65[ebp]
  0004e    89 45 e0     mov     DWORD PTR _max$[ebp], eax

; 8    : }

  00051    33 c0         xor     eax, eax
  00053    5f         pop     edi
  00054    5e         pop     esi
  00055    5b         pop     ebx
  00056    8b e5         mov     esp, ebp
  00058    5d         pop     ebp
  00059    c3         ret     0
_main    ENDP
_TEXT    ENDS
END
搜索更多相关主题的帖子: Microsoft generated documents visual Users 
2011-09-04 10:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是传统判断语句的结果:

程序代码:
void main(void)
{
    int a = 1;
    int b = 2;
    int max;

    if (a > b)
    {
        max = a;
    }
    else
    {
        max = b;
    }
}


程序代码:
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 

    TITLE    c:\Users\TonyDeng\documents\visual studio 2010\Projects\test4\test4\test.cpp
    .686P
    .XMM
    include listing.inc
    .model    flat

INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES

PUBLIC    _main
EXTRN    __RTC_Shutdown:PROC
EXTRN    __RTC_InitBase:PROC
;    COMDAT rtc$TMZ
; File c:\users\tonydeng\documents\visual studio 2010\projects\test4\test4\test.cpp
rtc$TMZ    SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ    ENDS
;    COMDAT rtc$IMZ
rtc$IMZ    SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ    ENDS
;    COMDAT _main
_TEXT    SEGMENT
_max$ = -32                        ; size = 4
_b$ = -20                        ; size = 4
_a$ = -8                        ; size = 4
_main    PROC                        ; COMDAT

; 2    : {

  00000    55         push     ebp
  00001    8b ec         mov     ebp, esp
  00003    81 ec e4 00 00
    00         sub     esp, 228        ; 000000e4H
  00009    53         push     ebx
  0000a    56         push     esi
  0000b    57         push     edi
  0000c    8d bd 1c ff ff
    ff         lea     edi, DWORD PTR [ebp-228]
  00012    b9 39 00 00 00     mov     ecx, 57            ; 00000039H
  00017    b8 cc cc cc cc     mov     eax, -858993460        ; ccccccccH
  0001c    f3 ab         rep stosd

; 3    :     int a = 1;

  0001e    c7 45 f8 01 00
    00 00         mov     DWORD PTR _a$[ebp], 1

; 4    :     int b = 2;

  00025    c7 45 ec 02 00
    00 00         mov     DWORD PTR _b$[ebp], 2

; 5    :     int max;
; 6    :
; 7    :     if (a > b)

  0002c    8b 45 f8     mov     eax, DWORD PTR _a$[ebp]
  0002f    3b 45 ec     cmp     eax, DWORD PTR _b$[ebp]
  00032    7e 08         jle     SHORT $LN2@main

; 8    :     {
; 9    :         max = a;

  00034    8b 45 f8     mov     eax, DWORD PTR _a$[ebp]
  00037    89 45 e0     mov     DWORD PTR _max$[ebp], eax

; 10   :     }
; 11   :     else

  0003a    eb 06         jmp     SHORT $LN3@main
$LN2@main:

; 12   :     {
; 13   :         max = b;

  0003c    8b 45 ec     mov     eax, DWORD PTR _b$[ebp]
  0003f    89 45 e0     mov     DWORD PTR _max$[ebp], eax
$LN3@main:

; 14   :     }
; 15   : }

  00042    33 c0         xor     eax, eax
  00044    5f         pop     edi
  00045    5e         pop     esi
  00046    5b         pop     ebx
  00047    8b e5         mov     esp, ebp
  00049    5d         pop     ebp
  0004a    c3         ret     0
_main    ENDP
_TEXT    ENDS
END


授人以渔,不授人以鱼。
2011-09-04 10:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1楼的汇编代码文件是2210byte,2楼的是2158byte。

熟悉汇编的请分析一下哪个的效率较高?

授人以渔,不授人以鱼。
2011-09-04 10:37
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
照这个看,应该是第二个好一点。
你可以试试编译时开优化呗,出的代码效果应该更好一些。
2011-09-04 15:19
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我用 gcc 在没有任何优化的条件下编译了一下。
不过 GNU 用的是 AT&T 的语法,和 intel 语法稍微有点区别。
主要是 mov a,b 是指把 a 存入 b。其它的在这里好像没体现。

这个是用三目运算符的。明显比你的那个要好一些。
  401428:    c7 44 24 0c 01 00 00     movl   $0x1,0xc(%esp)
  40142f:    00
  401430:    c7 44 24 08 02 00 00     movl   $0x2,0x8(%esp)
  401437:    00
  401438:    8b 54 24 0c              mov    0xc(%esp),%edx
  40143c:    8b 44 24 08              mov    0x8(%esp),%eax
  401440:    39 d0                    cmp    %edx,%eax
  401442:    7d 02                    jge    401446 <_main+0x36>
  401444:    89 d0                    mov    %edx,%eax
  401446:    89 44 24 04              mov    %eax,0x4(%esp)
  40144a:    b8 00 00 00 00           mov    $0x0,%eax
  40144f:    c9                       leave  
  401450:    c3                       ret   
  401451:    90                       nop
  401452:    90                       nop
  401453:    90                       nop
    ...


下面是用 if else 的。这个和你那第二个没有任何区别。
  401428:    c7 44 24 0c 01 00 00     movl   $0x1,0xc(%esp)
  40142f:    00
  401430:    c7 44 24 08 02 00 00     movl   $0x2,0x8(%esp)
  401437:    00
  401438:    8b 44 24 0c              mov    0xc(%esp),%eax
  40143c:    3b 44 24 08              cmp    0x8(%esp),%eax
  401440:    7e 0a                    jle    40144c <_main+0x3c>
  401442:    8b 44 24 0c              mov    0xc(%esp),%eax
  401446:    89 44 24 04              mov    %eax,0x4(%esp)
  40144a:    eb 08                    jmp    401454 <_main+0x44>
  40144c:    8b 44 24 08              mov    0x8(%esp),%eax
  401450:    89 44 24 04              mov    %eax,0x4(%esp)
  401454:    b8 00 00 00 00           mov    $0x0,%eax
  401459:    c9                       leave  
  40145a:    c3                       ret   
  40145b:    90                       nop
    ...
2011-09-04 16:34
calmsky
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-9-4
收藏
得分:0 
这个对于初学者来说我选择三目运算符
2011-09-04 16:52
fedcab123
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:100
注 册:2011-9-3
收藏
得分:0 
天书ING……
2011-09-04 17:12
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
有大牛在,乘机请教一下。tv65是哪里冒出来的?
程序代码:
  0002c    8b 45 f8             mov     eax, DWORD PTR _a$[ebp]
  0002f    3b 45 ec             cmp     eax, DWORD PTR _b$[ebp]
  00032    7e 0b                jle     SHORT $LN3@main
  00034    8b 4d f8             mov     ecx, DWORD PTR _a$[ebp]
  00037    89 8d 18 ff ff ff    mov     DWORD PTR tv65[ebp], ecx//这句的tv65是哪里冒出来的?
  0003d    eb 09                jmp     SHORT $LN4@main
$LN3@main:
  0003f    8b 55 ec     mov     edx, DWORD PTR _b$[ebp]
  00042    89 95 18 ff ff ff    mov     DWORD PTR tv65[ebp], edx
$LN4@main:
  00048    8b 85 18 ff ff ff    mov     eax, DWORD PTR tv65[ebp]
  0004e    89 45 e0     mov     DWORD PTR _max$[ebp], eax

一个单片机就让我头疼不已~~~
2011-09-04 18:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 5楼 pangding
等我开优化再看看如何.

授人以渔,不授人以鱼。
2011-09-04 20:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 8楼 dreamofgod
不知道,VS2010就出来这样的。有其它编译器的朋友可以试一试。

授人以渔,不授人以鱼。
2011-09-04 20:04
快速回复:看看三目运算符?:到底是怎么回事
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020490 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved