Daily Archives: 2018年10月26日

C++中if…else…与for(…)在汇编中的实现

1、编写两个简单的条件语句来反汇编一下看最终机器是如何工作的,以下示例是在XCode中反汇编的,即AT&T汇编,8086或win32也是相同的原理
1.1、if…else…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main(){
    int a = 0;
    int b = 0;
    if (a > 0){
        b = 1;
    }else{
        b = 2;
    }
    return 0;
}</cmath></iostream>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cplus`main:
    0x100000f70 <+0>:  pushq  %rbp
    0x100000f71 <+1>:  movq   %rsp, %rbp
    0x100000f74 <+4>:  movl   $0x0, -0x4(%rbp)
    0x100000f7b <+11>: movl   $0x0, -0x8(%rbp);int a
    0x100000f82 <+18>: movl   $0x0, -0xc(%rbp);int b
 
    ;if...else...开始
    ;1、小于或等于则跳转到3【0x100000f9f】
    0x100000f89 <+25>: cmpl   $0x0, -0x8(%rbp)
    0x100000f8d <+29>: jle    0x100000f9f
 
    ;2.1、符合条件则执行if条件下的代码
    0x100000f93 <+35>: movl   $0x1, -0xc(%rbp);b=1
    ;2.2、执行结束后直接跳转到结尾
    0x100000f9a <+42>: jmp    0x100000fa6
 
    ;3、else条件下的代码
    0x100000f9f <+47>: movl   $0x2, -0xc(%rbp);b=2
    ;if...else...结束
 
    0x100000fa6 <+54>: xorl   %eax, %eax
    0x100000fa8 <+56>: popq   %rbp
    0x100000fa9 <+57>: retq

1.2、for(…;…;…)[……]

继续阅读