cpp学习-第五章-语句

核心简记

  1. 表达式语句的作用是执行表达式并丢弃求值结果。语法定义的bnf为:块-语句-表达式
  2. 复合语句(块)也是语句,单独作用域,外不访问内,内可访问外。
  3. if、switch、while、for的控制结构内可以定义变量。作用域为相应语句内部。
  4. else if其实就是else下的语句为if语句。语法bnf定义的只有if与if else 。else匹配的是最近尚未匹配的if,块中的不会匹配
  5. switch也属于条件语句,每句应加break与{}
  6. c++规定不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。
  7. 定义在while条件部分或者循环体内的变量每次迭代都会创建到销毁,之前试的那个基本类型初始化就是赋值所以不明显。类对象在栈中的话会调用构造与析构函数。分配栈中的空间会函数一开始就留好,每次初始化析构就可以了,但是堆中的是由运行时分配的,不会自动执行回收销毁,只是指针会创建销毁,因此堆中要手动释放。
  8. 范围for就是使用迭代器
  9. do while的最后有分号,条件使用的变量必须定义于循环体之外。
  10. break只作用于:负责终止离它最近的while、do while、for、switch。只是这些
  11. continue只作用于:for、while、do while
  12. goto只能同一函数内
  13. try与catch的语法、汇编实现见下-重点

范围for等价的是:

1
2
3
4
5
6
7
8
9
10
for(auto &r:V)
{
r *=2;
}
for(auto beg=v.begin(),end=v.end();beg!=end;++beg)
{
auto &r=*beg;
r*=2;
}

try-catch

异常处理使不同功能的代码分离。c++异常处理包括:
throw:异常检测部分使用,表示遇到异常
try:异常处理部分使用try-catch处理异常
异常类:传递信息

throw

1
throw runtime_error("123");

throw+表达式,表达式的类型就是抛出的异常类型,必须加分号。
抛出异常终止当前函数,并把控制权转移给能处理该异常的代码。

try

1
2
3
4
5
6
7
8
try
{
}
catch(runtime_error e)
{
std::cout << e.what() << '\n';
}

try中发生异常中断执行,选中catch执行,之后跳转到最后一个catch子句之后那条语句。
try块与catch块独立作用域。

寻找处理代码过程:搜索抛出异常的函数catch,没找到就终止函数。并向外继续寻找。最终没有匹配将转到terminate标准库函数。

异常处理应该清理未完成工作。

标准异常

每个标准库异常都定义了what成员函数。

标准异常类 描述 头文件
exception 最通用的异常类,只报告异常的发生而不提供任何额外的信息 exception
runtime_error 只有在运行时才能检测出的错误 stdexcept
rang_error 运行时错误:产生了超出有意义值域范围的结果 stdexcept
overflow_error 运行时错误:计算上溢 stdexcept
underflow_error 运行时错误:计算下溢 stdexcept
logic_error 程序逻辑错误 stdexcept
domain_error 逻辑错误:参数对应的结果值不存在 stdexcept
invalid_argument 逻辑错误:无效参数 stdexcept
length_error 逻辑错误:试图创建一个超出该类型最大长度的对象 stdexcept
out_of_range 逻辑错误:使用一个超出有效范围的值 stdexcept
bad_alloc 内存动态分配错误 new
bad_cast dynamic_cast类型转换出错 type_info

只能默认初始化exception、bad_alloc、bad_cast。其它用string或c风格字串初始化。

反汇编

RISC就是通过优化,选取最常用的指令,剔除了那些不太常用,却会大大增加运算器复杂程度的指令,使得运算器大幅度简化,这样就可以给每个寄存器配备一个独立的运算器。因此叫精简指令集

Application:

1
2
3
APP_STL := gnustl_static
APP_OPTIM := debug
APP_CPPFLAGS += -fexceptions

5.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<vector>
#include<exception>
#include<iostream>
#include<vector>
using std::vector;
#include<stdexcept>
using std::runtime_error;
int f(int i)
{
try
{
throw runtime_error("12345");
}
catch(char* e)
{
std::cout << "f-catch" << '\n';
}
return 1;
}
int main(int argc, char const *argv[])
{
int b=2;
//switch
switch(argc)
{
case 0:
{
int a=1;
break;
}
case 1:
{
b=3;
break;
}
default:
;
}
//while内变量创建与销毁
while(b--)
{
vector<int> v1(3);
v1[0]=5;
}
//异常处理
try
{
f(b);
}
catch(runtime_error e)
{
std::cerr << e.what() << '\n';
}
return 0;
}

X86-64

指令简记

传参是di、si–更多见函数章节

endp是过程结束

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
.text:0000000000008020 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:0000000000008020 main proc near ; DATA XREF: start+2E↑o
.text:0000000000008020
.text:0000000000008020 var_9C = dword ptr -9Ch
.text:0000000000008020 var_70 = qword ptr -70h
.text:0000000000008020 var_64 = dword ptr -64h
.text:0000000000008020 var_60 = dword ptr -60h
.text:0000000000008020 var_5C = dword ptr -5Ch
.text:0000000000008020 var_58 = qword ptr -58h
.text:0000000000008020 var_50 = dword ptr -50h
.text:0000000000008020 var_4C = dword ptr -4Ch
.text:0000000000008020 var_48 = qword ptr -48h
.text:0000000000008020 var_40 = dword ptr -40h
.text:0000000000008020 var_3C = dword ptr -3Ch
.text:0000000000008020 var_28 = byte ptr -28h
.text:0000000000008020 var_20 = byte ptr -20h
.text:0000000000008020 var_8 = qword ptr -8
.text:0000000000008020
.text:0000000000008020 ; FUNCTION CHUNK AT .text:0000000000008204 SIZE 0000001E BYTES
.text:0000000000008020
.text:0000000000008020 ; __unwind { // sub_9760
//栈帧
.text:0000000000008020 push rbp
.text:0000000000008021 mov rbp, rsp
.text:0000000000008024 sub rsp, 0A0h
//溢出保护
.text:000000000000802B mov rax, fs:28h
.text:0000000000008034 mov [rbp+var_8], rax
.text:0000000000008038 mov [rbp+var_3C], 0
//edi是argc
.text:000000000000803F mov [rbp+var_40], edi
.text:0000000000008042 mov [rbp+var_48], rsi
//int b=2;
.text:0000000000008046 mov [rbp+var_4C], 2
//switch(argc)
.text:000000000000804D mov edi, [rbp+var_40]
.text:0000000000008050 test edi, edi
.text:0000000000008052 mov [rbp+var_60], edi
.text:0000000000008055 jz loc_8074
.text:000000000000805B jmp $+5
.text:0000000000008060 ; ---------------------------------------------------------------------------
.text:0000000000008060
.text:0000000000008060 loc_8060: ; CODE XREF: main+3B↑j
.text:0000000000008060 mov eax, [rbp+var_60]
.text:0000000000008063 sub eax, 1
.text:0000000000008066 mov [rbp+var_64], eax
.text:0000000000008069 jz loc_8080 //case 1
.text:000000000000806F jmp loc_808C
.text:0000000000008074 ; ---------------------------------------------------------------------------
.text:0000000000008074
//case 0
.text:0000000000008074 loc_8074: ; CODE XREF: main+35↑j
.text:0000000000008074 mov [rbp+var_50], 1
.text:000000000000807B jmp loc_8091
.text:0000000000008080 ; ---------------------------------------------------------------------------
.text:0000000000008080
//case 1
.text:0000000000008080 loc_8080: ; CODE XREF: main+49↑j
.text:0000000000008080 mov [rbp+var_4C], 3
.text:0000000000008087 jmp loc_8091
.text:000000000000808C ; ---------------------------------------------------------------------------
.text:000000000000808C
//defult
.text:000000000000808C loc_808C: ; CODE XREF: main+4F↑j
.text:000000000000808C jmp $+5
.text:0000000000008091 ; ---------------------------------------------------------------------------
.text:0000000000008091
//switch出口
.text:0000000000008091 loc_8091: ; CODE XREF: main+5B↑j
.text:0000000000008091 ; main+67↑j ...
.text:0000000000008091 jmp $+5
.text:0000000000008096 ; ---------------------------------------------------------------------------
.text:0000000000008096
//while(b--)
.text:0000000000008096 loc_8096: ; CODE XREF: main:loc_8091↑j
.text:0000000000008096 ; main+D8↓j
.text:0000000000008096 mov eax, [rbp+var_4C]
.text:0000000000008099 mov ecx, eax
//+(0-1)=-1
.text:000000000000809B add ecx, 0FFFFFFFFh
.text:000000000000809E mov [rbp+var_4C], ecx
.text:00000000000080A1 cmp eax, 0
.text:00000000000080A4 jz loc_8114
.text:00000000000080AA lea rax, [rbp+var_28]
.text:00000000000080AE mov rdi, rax
.text:00000000000080B1 mov [rbp+var_70], rax
.text:00000000000080B5 call sub_8230
// vector<int> v1(3);
.text:00000000000080BA mov ecx, 3
.text:00000000000080BF mov esi, ecx
.text:00000000000080C1 lea rdi, [rbp+var_20]
.text:00000000000080C5 mov rdx, [rbp+var_70]
.text:00000000000080C9 call sub_8250
.text:00000000000080D3 lea rdi, [rbp+var_28]
.text:00000000000080D7 call sub_82C0
//v1[0]=5; var_20是this,esi是0
.text:00000000000080DC lea rdi, [rbp+var_20]
.text:00000000000080E0 xor eax, eax
.text:00000000000080E2 mov esi, eax
.text:00000000000080E4 call sub_82E0
.text:00000000000080E9 lea rdi, [rbp+var_20]
.text:00000000000080ED mov dword ptr [rax], 5
//析构?
.text:00000000000080F3 call sub_8310
.text:00000000000080F8 jmp loc_8096
.text:00000000000080FD ; ---------------------------------------------------------------------------
//这段并不会调用
.text:00000000000080FD lea rdi, [rbp+var_28]
.text:0000000000008101 mov ecx, edx
.text:0000000000008103 mov [rbp+var_58], rax
.text:0000000000008107 mov [rbp+var_5C], ecx
.text:000000000000810A call sub_82C0
.text:000000000000810F jmp loc_8204
.text:0000000000008114 ; ---------------------------------------------------------------------------
.text:0000000000008114
//while 出口
.text:0000000000008114 loc_8114: ; CODE XREF: main+84↑j
// f(b);
.text:0000000000008114 mov edi, [rbp+var_4C]
.text:0000000000008117 call sub_7EB0
.text:000000000000811C ; ---------------------------------------------------------------------------
.text:000000000000811C mov [rbp-74h], eax
.text:000000000000811F jmp $+5
.text:0000000000008124 ; ---------------------------------------------------------------------------
.text:0000000000008124
.text:0000000000008124 loc_8124: ; CODE XREF: .text:000000000000811F↑j
.text:0000000000008124 jmp loc_81C2
.text:0000000000008129 ; ---------------------------------------------------------------------------
.text:0000000000008129 mov ecx, edx
.text:000000000000812B mov [rbp-58h], rax
.text:000000000000812F mov [rbp-5Ch], ecx
.text:0000000000008132 mov eax, [rbp-5Ch]
.text:0000000000008135 mov ecx, 1
.text:000000000000813A cmp eax, ecx
.text:000000000000813C jnz loc_8204
.text:0000000000008142 mov rax, [rbp-58h]
.text:0000000000008146 mov rdi, rax
.text:0000000000008149 mov [rbp-80h], rax
.text:000000000000814D call sub_8F90
.text:0000000000008152 lea rdi, [rbp-38h]
.text:0000000000008156 mov rsi, rax
.text:0000000000008159 call sub_8380
.text:000000000000815E jmp $+5
.text:0000000000008163 ; ---------------------------------------------------------------------------
.text:0000000000008163
.text:0000000000008163 loc_8163: ; CODE XREF: .text:000000000000815E↑j
.text:0000000000008163 mov rdi, [rbp-80h]
.text:0000000000008167 call sub_8FA0
.text:000000000000816C lea rdi, [rbp-38h]
.text:0000000000008170 mov [rbp-88h], rax
.text:0000000000008177 call sub_1EA10
.text:000000000000817C lea rdi, unk_6AB80
.text:0000000000008183 mov rsi, rax
.text:0000000000008186 call sub_1E8F0
.text:000000000000818B mov [rbp-90h], rax
.text:0000000000008192 jmp $+5
.text:0000000000008197 ; ---------------------------------------------------------------------------
.text:0000000000008197
.text:0000000000008197 loc_8197: ; CODE XREF: .text:0000000000008192↑j
.text:0000000000008197 mov esi, 0Ah
.text:000000000000819C mov rdi, [rbp-90h]
.text:00000000000081A3 call sub_1E8D0
.text:00000000000081A8 mov [rbp-98h], rax
.text:00000000000081AF jmp $+5
.text:00000000000081B4 ; ---------------------------------------------------------------------------
.text:00000000000081B4
.text:00000000000081B4 loc_81B4: ; CODE XREF: .text:00000000000081AF↑j
.text:00000000000081B4 lea rdi, [rbp-38h]
.text:00000000000081B8 call sub_1EA90
.text:00000000000081BD call sub_9010
.text:00000000000081C2
.text:00000000000081C2 loc_81C2: ; CODE XREF: .text:loc_8124↑j
.text:00000000000081C2 mov rax, fs:28h
.text:00000000000081CB mov rcx, [rbp-8]
.text:00000000000081CF cmp rax, rcx
.text:00000000000081D2 jnz loc_821D
.text:00000000000081D8 xor eax, eax
.text:00000000000081DA add rsp, 0A0h
.text:00000000000081E1 pop rbp
.text:00000000000081E2 retn
.text:00000000000081E3 ; ---------------------------------------------------------------------------
.text:00000000000081E3 mov ecx, edx
.text:00000000000081E5 mov [rbp-58h], rax
.text:00000000000081E9 mov [rbp-5Ch], ecx
.text:00000000000081EC lea rdi, [rbp-38h]
.text:00000000000081F0 call sub_1EA90
.text:00000000000081F5 call sub_9010
.text:00000000000081FA jmp $+5
.text:00000000000081FF ; ---------------------------------------------------------------------------
.text:00000000000081FF
.text:00000000000081FF loc_81FF: ; CODE XREF: .text:00000000000081FA↑j
.text:00000000000081FF jmp $+5
.text:0000000000008204 ; ---------------------------------------------------------------------------
.text:0000000000008204 ; START OF FUNCTION CHUNK FOR main
.text:0000000000008204
.text:0000000000008204 loc_8204: ; CODE XREF: main+EF↑j
.text:0000000000008204 ; .text:000000000000813C↑j ...
.text:0000000000008204 mov rdi, [rbp+var_58]
.text:0000000000008208 call sub_43CCB
.text:000000000000820D mov ecx, edx
.text:000000000000820F mov rdi, rax
.text:0000000000008212 mov [rbp+var_9C], ecx
.text:0000000000008218 call sub_8410
.text:000000000000821D ; ---------------------------------------------------------------------------
.text:000000000000821D
.text:000000000000821D loc_821D: ; CODE XREF: .text:00000000000081D2↑j
.text:000000000000821D call ___stack_chk_fail
.text:000000000000821D ; } // starts at 8020
.text:000000000000821D ; END OF FUNCTION CHUNK FOR main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
.text:0000000000007EB0 sub_7EB0 proc near ; CODE XREF: main+F7↓p
.text:0000000000007EB0
.text:0000000000007EB0 var_50 = qword ptr -50h
.text:0000000000007EB0 var_48 = qword ptr -48h
.text:0000000000007EB0 var_40 = qword ptr -40h
.text:0000000000007EB0 var_2D = byte ptr -2Dh
.text:0000000000007EB0 var_1C = dword ptr -1Ch
.text:0000000000007EB0 var_18 = byte ptr -18h
.text:0000000000007EB0 var_10 = byte ptr -10h
.text:0000000000007EB0 var_8 = qword ptr -8
.text:0000000000007EB0
.text:0000000000007EB0 ; __unwind { // sub_9760
.text:0000000000007EB0 push rbp
.text:0000000000007EB1 mov rbp, rsp
.text:0000000000007EB4 sub rsp, 60h
.text:0000000000007EB8 mov rax, fs:28h
.text:0000000000007EC1 mov [rbp+var_8], rax
.text:0000000000007EC5 mov [rbp+var_1C], edi
.text:0000000000007EC8 mov edi, 10h
.text:0000000000007ECD call sub_8DD0
.text:0000000000007ED2 mov rdi, rax
.text:0000000000007ED5 mov [rbp+var_2D], 1
.text:0000000000007ED9 lea rcx, [rbp+var_18]
.text:0000000000007EDD mov [rbp+var_40], rdi
.text:0000000000007EE1 mov rdi, rcx
.text:0000000000007EE4 mov [rbp+var_48], rcx
.text:0000000000007EE8 mov [rbp+var_50], rax
.text:0000000000007EEC call nullsub_3
.text:0000000000007EF1 lea rsi, a12345 ; "12345"
.text:0000000000007EF8 lea rdi, [rbp+var_10]
.text:0000000000007EFC mov rdx, [rbp+var_48]
.text:0000000000007F00 call sub_30880
.text:0000000000007F05 jmp $+5
.text:0000000000007F0A ; ---------------------------------------------------------------------------
.text:0000000000007F0A
.text:0000000000007F0A loc_7F0A: ; CODE XREF: sub_7EB0+55↑j
.text:0000000000007F0A lea rsi, [rbp+var_10]
.text:0000000000007F0E mov rdi, [rbp+var_50]
.text:0000000000007F12 call sub_1EEC0
.text:0000000000007F17 jmp $+5
.text:0000000000007F1C ; ---------------------------------------------------------------------------
.text:0000000000007F1C
.text:0000000000007F1C loc_7F1C: ; CODE XREF: sub_7EB0+67↑j
.text:0000000000007F1C mov [rbp+var_2D], 0
.text:0000000000007F20 lea rsi, _ZTISt13runtime_error ; `typeinfo for'std::runtime_error
.text:0000000000007F27 lea rdx, sub_1EA90
.text:0000000000007F2E mov rdi, [rbp+var_40]
.text:0000000000007F32 call sub_9F80
.text:0000000000007F32 sub_7EB0 endp
.text:0000000000007F32
.text:0000000000007F37 ; ---------------------------------------------------------------------------
.text:0000000000007F37 jmp loc_800F
.text:0000000000007F3C ; ---------------------------------------------------------------------------
.text:0000000000007F3C mov ecx, edx
.text:0000000000007F3E mov [rbp-28h], rax
.text:0000000000007F42 mov [rbp-2Ch], ecx
.text:0000000000007F45 jmp loc_7F5C
.text:0000000000007F4A ; ---------------------------------------------------------------------------
.text:0000000000007F4A lea rdi, [rbp-10h]
.text:0000000000007F4E mov ecx, edx
.text:0000000000007F50 mov [rbp-28h], rax
.text:0000000000007F54 mov [rbp-2Ch], ecx
.text:0000000000007F57 call sub_30A90
.text:0000000000007F5C
.text:0000000000007F5C loc_7F5C: ; CODE XREF: .text:0000000000007F45↑j
.text:0000000000007F5C lea rdi, [rbp-18h]
.text:0000000000007F60 call nullsub_4
.text:0000000000007F65 test byte ptr [rbp-2Dh], 1
.text:0000000000007F69 jnz loc_7F74
.text:0000000000007F6F jmp loc_7F7D
.text:0000000000007F74 ; ---------------------------------------------------------------------------
.text:0000000000007F74
.text:0000000000007F74 loc_7F74: ; CODE XREF: .text:0000000000007F69↑j
.text:0000000000007F74 mov rdi, [rbp-40h]
.text:0000000000007F78 call sub_8EC0
.text:0000000000007F7D
.text:0000000000007F7D loc_7F7D: ; CODE XREF: .text:0000000000007F6F↑j
.text:0000000000007F7D jmp $+5
.text:0000000000007F82 ; ---------------------------------------------------------------------------
.text:0000000000007F82
.text:0000000000007F82 loc_7F82: ; CODE XREF: .text:loc_7F7D↑j
.text:0000000000007F82 mov eax, [rbp-2Ch]
.text:0000000000007F85 mov ecx, 1
.text:0000000000007F8A cmp eax, ecx
.text:0000000000007F8C jnz loc_8006
.text:0000000000007F92 mov rdi, [rbp-28h]
.text:0000000000007F96 call sub_8FA0
.text:0000000000007F9B mov [rbp-38h], rax
.text:0000000000007F9F lea rdi, unk_6ACC0
.text:0000000000007FA6 lea rsi, aFCatch ; "f-catch"
.text:0000000000007FAD call sub_1E8F0
.text:0000000000007FB2 mov [rbp-58h], rax
.text:0000000000007FB6 jmp $+5
.text:0000000000007FBB ; ---------------------------------------------------------------------------
.text:0000000000007FBB
.text:0000000000007FBB loc_7FBB: ; CODE XREF: .text:0000000000007FB6↑j
.text:0000000000007FBB mov esi, 0Ah
.text:0000000000007FC0 mov rdi, [rbp-58h]
.text:0000000000007FC4 call sub_1E8D0
.text:0000000000007FC9 mov [rbp-60h], rax
.text:0000000000007FCD jmp $+5
.text:0000000000007FD2 ; ---------------------------------------------------------------------------
.text:0000000000007FD2
.text:0000000000007FD2 loc_7FD2: ; CODE XREF: .text:0000000000007FCD↑j
.text:0000000000007FD2 call sub_9010
.text:0000000000007FD7 mov rax, fs:28h
.text:0000000000007FE0 mov rcx, [rbp-8]
.text:0000000000007FE4 cmp rax, rcx
.text:0000000000007FE7 jnz loc_800F
.text:0000000000007FED mov eax, 1
.text:0000000000007FF2 add rsp, 60h
.text:0000000000007FF6 pop rbp
.text:0000000000007FF7 retn
.text:0000000000007FF8 ; ---------------------------------------------------------------------------
.text:0000000000007FF8 mov ecx, edx
.text:0000000000007FFA mov [rbp-28h], rax
.text:0000000000007FFE mov [rbp-2Ch], ecx
.text:0000000000008001 call sub_9010
.text:0000000000008006
.text:0000000000008006 loc_8006: ; CODE XREF: .text:0000000000007F8C↑j
.text:0000000000008006 mov rdi, [rbp-28h]
.text:000000000000800A call sub_43CCB
.text:000000000000800F
.text:000000000000800F loc_800F: ; CODE XREF: .text:0000000000007F37↑j
.text:000000000000800F ; .text:0000000000007FE7↑j
.text:000000000000800F call ___stack_chk_fail
.text:000000000000800F ; } // starts at 7EB0

if语句汇编效果为:不满足就跳过

1
2
3
jxx A
if语句块
A:

if else语句的汇编效果为:在if块后多加个jmp跳出

1
2
3
4
5
6
7
jxx ELSE_B
if块
jmp END
ELSE_B
else块
ELSE_E
END

else if汇编:

1
2
3
4
5
6
7
8
9
10
11
12
jxx ELSE_B
if块
jmp END
ELSE_B
jxx ELSE_B2
else if块
jmp END
ELSE_B2
else块
ELSE_E2
ELSE_E
END

可见多重条件分支就是else内嵌套。从编译时语法处理看,BNF表示就俩种if语句:条件 true语句 | 条件 true语句 false语句
语句可以又是if语句,因此按bnf解析else if将被解析为else的语句是if语句,if语句可以含或不含else,因此最后加不加else都可以。默认先移进,因此else匹配最近的if。
构造AST后生成的代码依旧按左到右对应语句的顺序,因此生成的汇编代码如上。分支的基本单位是语句块,只要确定语句块的出入口就可以确定分支。此后就是高中的流程图分析了

关于switch的汇编:
不同于if,所有的case语句块是连在一起的,为了实现语法要求不加break可以继续执行。因此前面依次判断条件跳转。根据条件数字结构不同,可以有:

  1. case数量小时,直接依次cmp判断,此时效率不如if
  2. 线性且连续时,case地址放于数组中,用下标间接跳转。
  3. 线性且差不太大时,俩个表,地址表存case地址,索引表存地址表下标,内容小、因此索引表可以大点。间接俩次
  4. 差值大时,采用平衡二叉树,采用编译好的连续cmp+跳转实现

优化时,当子树的叶子节点不大于3时,会编译为ifelse结构而不平衡。当子树可以有1、2、3、4中优化措施时,将对子树采用以上的编译方式。因此判断分发部分常常是混合使用的,case部分是连续的始终。

函数的块内作用域都是编译器负责检查的,统一分配在栈中实际

do-while:

1
2
3
A
循环块
jxx A

while:

1
2
3
4
5
A:
jxx END
循环块
jmp A
END

for:实际上ndk编译for的结果与while一样,把计算步长放到jmp B前了

1
2
3
4
5
6
7
8
9
10
初始化
jmp A
B:
步长计算
A:
cmp
jxx END
循环块
jmp B
END

计算效率dowhile>while>=for。

异常处理部分暂时看不懂….收集了一些资料,在18章中深入进行分析….
一篇不错的文章:
https://monoinfinito.wordpress.com/series/exception-handling-in-c/
window下c++的异常机制-比较专业的文档:
http://www.ecice06.com/CN/article/downloadArticleFile.do?attachType=PDF&id=10631

ARM64

指令简记

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
.text:000000000000932C ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:000000000000932C EXPORT main
.text:000000000000932C main ; DATA XREF: LOAD:0000000000000E28↑o
.text:000000000000932C ; .got:main_ptr↓o
.text:000000000000932C
.text:000000000000932C var_AC = -0xAC
.text:000000000000932C var_70 = -0x70
.text:000000000000932C var_64 = -0x64
.text:000000000000932C var_60 = -0x60
.text:000000000000932C var_5C = -0x5C
.text:000000000000932C var_58 = -0x58
.text:000000000000932C var_50 = -0x50
.text:000000000000932C var_4C = -0x4C
.text:000000000000932C var_48 = -0x48
.text:000000000000932C var_40 = -0x40
.text:000000000000932C var_3C = -0x3C
.text:000000000000932C var_28 = -0x28
.text:000000000000932C var_20 = -0x20
.text:000000000000932C var_8 = -8
.text:000000000000932C var_s0 = 0
.text:000000000000932C
.text:000000000000932C ; FUNCTION CHUNK AT .text:0000000000009524 SIZE 00000018 BYTES
.text:000000000000932C
.text:000000000000932C ; __unwind { // sub_AA24
.text:000000000000932C SUB SP, SP, #0xC0
.text:0000000000009330 STP X29, X30, [SP,#0xB0+var_s0]
.text:0000000000009334 ADD X29, SP, #0xB0
.text:0000000000009338 MRS X8, #3, c13, c0, #2
.text:000000000000933C LDR X8, [X8,#0x28]
.text:0000000000009340 STUR X8, [X29,#var_8]
.text:0000000000009344 MOV W9, WZR
.text:0000000000009348 STUR W9, [X29,#var_3C]
.text:000000000000934C STUR W0, [X29,#var_40]
.text:0000000000009350 STUR X1, [X29,#var_48]
// int b=2;
.text:0000000000009354 MOV W9, #2
.text:0000000000009358 STUR W9, [X29,#var_4C]
// switch
.text:000000000000935C LDUR W9, [X29,#var_40]
.text:0000000000009360 MOV W0, W9
.text:0000000000009364 STR W0, [SP,#0xB0+var_60]
.text:0000000000009368 CBZ W9, loc_9384
.text:000000000000936C B loc_9370
.text:0000000000009370 ; ---------------------------------------------------------------------------
.text:0000000000009370
.text:0000000000009370 loc_9370 ; CODE XREF: main+40↑j
.text:0000000000009370 LDR W8, [SP,#0xB0+var_60]
.text:0000000000009374 SUBS W9, W8, #1
.text:0000000000009378 STR W9, [SP,#0xB0+var_64]
.text:000000000000937C B.EQ loc_9390
.text:0000000000009380 B loc_939C
.text:0000000000009384 ; ---------------------------------------------------------------------------
.text:0000000000009384
.text:0000000000009384 loc_9384 ; CODE XREF: main+3C↑j
.text:0000000000009384 MOV W8, #1
.text:0000000000009388 STUR W8, [X29,#var_50]
.text:000000000000938C B loc_93A0
.text:0000000000009390 ; ---------------------------------------------------------------------------
.text:0000000000009390
.text:0000000000009390 loc_9390 ; CODE XREF: main+50↑j
.text:0000000000009390 MOV W8, #3
.text:0000000000009394 STUR W8, [X29,#var_4C]
.text:0000000000009398 B loc_93A0
.text:000000000000939C ; ---------------------------------------------------------------------------
.text:000000000000939C
.text:000000000000939C loc_939C ; CODE XREF: main+54↑j
.text:000000000000939C B loc_93A0
.text:00000000000093A0 ; ---------------------------------------------------------------------------
.text:00000000000093A0
.text:00000000000093A0 loc_93A0 ; CODE XREF: main+60↑j
.text:00000000000093A0 ; main+6C↑j ...
.text:00000000000093A0 B loc_93A4
.text:00000000000093A4 ; ---------------------------------------------------------------------------
.text:00000000000093A4
.text:00000000000093A4 loc_93A4 ; CODE XREF: main:loc_93A0↑j
.text:00000000000093A4 ; main+DC↓j
//while
.text:00000000000093A4 LDUR W8, [X29,#var_4C]
.text:00000000000093A8 SUB W9, W8, #1
.text:00000000000093AC STUR W9, [X29,#var_4C]
.text:00000000000093B0 CBZ W8, loc_9428
.text:00000000000093B4 SUB X8, X29, #-var_28
.text:00000000000093B8 MOV X0, X8
.text:00000000000093BC STR X8, [SP,#0xB0+var_70]
.text:00000000000093C0 BL sub_953C
.text:00000000000093C4 MOV W9, #3
.text:00000000000093C8 MOV W1, W9
.text:00000000000093CC SUB X0, X29, #-var_20
.text:00000000000093D0 LDR X2, [SP,#0xB0+var_70]
.text:00000000000093D4 BL sub_9560
.text:00000000000093D8 B loc_93DC
.text:00000000000093DC ; ---------------------------------------------------------------------------
.text:00000000000093DC
.text:00000000000093DC loc_93DC ; CODE XREF: main+AC↑j
.text:00000000000093DC SUB X0, X29, #-var_28
.text:00000000000093E0 BL sub_95D4
.text:00000000000093E4 SUB X0, X29, #-var_20
.text:00000000000093E8 MOV X30, XZR
.text:00000000000093EC MOV X1, X30
.text:00000000000093F0 BL sub_95F8
.text:00000000000093F4 SUB X1, X29, #-var_20
.text:00000000000093F8 MOV W8, #5
.text:00000000000093FC STR W8, [X0]
.text:0000000000009400 MOV X0, X1
.text:0000000000009404 BL sub_9624
.text:0000000000009408 B loc_93A4
.text:000000000000940C ; ---------------------------------------------------------------------------
.text:000000000000940C SUB X8, X29, #-var_28
.text:0000000000009410 MOV W9, W1
.text:0000000000009414 STR X0, [SP,#0xB0+var_58]
.text:0000000000009418 STR W9, [SP,#0xB0+var_5C]
.text:000000000000941C MOV X0, X8
.text:0000000000009420 BL sub_95D4
.text:0000000000009424 B loc_9524
.text:0000000000009428 ; ---------------------------------------------------------------------------
.text:0000000000009428
// f
.text:0000000000009428 loc_9428 ; CODE XREF: main+84↑j
.text:0000000000009428 LDUR W0, [X29,#var_4C]
.text:000000000000942C BL sub_91C0
.text:000000000000942C ; End of function main
.text:000000000000942C
.text:0000000000009430 ; ---------------------------------------------------------------------------
.text:0000000000009430 STR W0, [SP,#0x3C]
.text:0000000000009434 B loc_9438
.text:0000000000009438 ; ---------------------------------------------------------------------------
.text:0000000000009438
.text:0000000000009438 loc_9438 ; CODE XREF: .text:0000000000009434↑j
.text:0000000000009438 B loc_94DC
.text:000000000000943C ; ---------------------------------------------------------------------------
.text:000000000000943C MOV W8, W1
.text:0000000000009440 STR X0, [SP,#0x58]
.text:0000000000009444 STR W8, [SP,#0x54]
.text:0000000000009448 LDR W8, [SP,#0x54]
.text:000000000000944C MOV W9, #1
.text:0000000000009450 CMP W8, W9
.text:0000000000009454 B.NE loc_9524
.text:0000000000009458 LDR X8, [SP,#0x58]
.text:000000000000945C MOV X0, X8
.text:0000000000009460 STR X0, [SP,#0x30]
.text:0000000000009464 MOV X0, X8
.text:0000000000009468 BL sub_A2FC
.text:000000000000946C SUB X8, X29, #0x38
.text:0000000000009470 STR X0, [SP,#0x28]
.text:0000000000009474 MOV X0, X8
.text:0000000000009478 LDR X1, [SP,#0x28]
.text:000000000000947C BL sub_96A0
.text:0000000000009480 B loc_9484
.text:0000000000009484 ; ---------------------------------------------------------------------------
.text:0000000000009484
.text:0000000000009484 loc_9484 ; CODE XREF: .text:0000000000009480↑j
.text:0000000000009484 LDR X0, [SP,#0x30]
.text:0000000000009488 BL sub_A304
.text:000000000000948C SUB X30, X29, #0x38
.text:0000000000009490 STR X0, [SP,#0x20]
.text:0000000000009494 MOV X0, X30
.text:0000000000009498 BL sub_1DDC8
.text:000000000000949C ADRP X30, #off_65DC0@PAGE
.text:00000000000094A0 LDR X30, [X30,#off_65DC0@PAGEOFF]
.text:00000000000094A4 STR X0, [SP,#0x18]
.text:00000000000094A8 MOV X0, X30
.text:00000000000094AC LDR X1, [SP,#0x18]
.text:00000000000094B0 BL sub_1DC6C
.text:00000000000094B4 STR X0, [SP,#0x10]
.text:00000000000094B8 B loc_94BC
.text:00000000000094BC ; ---------------------------------------------------------------------------
.text:00000000000094BC
.text:00000000000094BC loc_94BC ; CODE XREF: .text:00000000000094B8↑j
.text:00000000000094BC MOV W1, #0xA
.text:00000000000094C0 LDR X0, [SP,#0x10]
.text:00000000000094C4 BL sub_1DC48
.text:00000000000094C8 STR X0, [SP,#8]
.text:00000000000094CC B loc_94D0
.text:00000000000094D0 ; ---------------------------------------------------------------------------
.text:00000000000094D0
.text:00000000000094D0 loc_94D0 ; CODE XREF: .text:00000000000094CC↑j
.text:00000000000094D0 SUB X0, X29, #0x38
.text:00000000000094D4 BL sub_1DE5C
.text:00000000000094D8 BL sub_A3A4
.text:00000000000094DC
.text:00000000000094DC loc_94DC ; CODE XREF: .text:loc_9438↑j
.text:00000000000094DC MRS X8, #3, c13, c0, #2
.text:00000000000094E0 LDR X8, [X8,#0x28]
.text:00000000000094E4 LDUR X9, [X29,#-8]
.text:00000000000094E8 CMP X8, X9
.text:00000000000094EC B.NE loc_9538
.text:00000000000094F0 MOV W8, WZR
.text:00000000000094F4 MOV W0, W8
.text:00000000000094F8 LDP X29, X30, [SP,#0xB0]
.text:00000000000094FC ADD SP, SP, #0xC0
.text:0000000000009500 RET
.text:0000000000009504 ; ---------------------------------------------------------------------------
.text:0000000000009504 STR X0, [SP,#0x58]
.text:0000000000009508 MOV W8, W1
.text:000000000000950C STR W8, [SP,#0x54]
.text:0000000000009510 SUB X0, X29, #0x38
.text:0000000000009514 BL sub_1DE5C
.text:0000000000009518 BL sub_A3A4
.text:000000000000951C B loc_9520
.text:0000000000009520 ; ---------------------------------------------------------------------------
.text:0000000000009520
.text:0000000000009520 loc_9520 ; CODE XREF: .text:000000000000951C↑j
.text:0000000000009520 B loc_9524
.text:0000000000009524 ; ---------------------------------------------------------------------------
.text:0000000000009524 ; START OF FUNCTION CHUNK FOR main
.text:0000000000009524
.text:0000000000009524 loc_9524 ; CODE XREF: main+F8↑j
.text:0000000000009524 ; .text:0000000000009454↑j ...
.text:0000000000009524 LDR X0, [SP,#0xB0+var_58]
.text:0000000000009528 BL sub_42344
.text:000000000000952C MOV W2, W1
.text:0000000000009530 STR W2, [SP,#0xB0+var_AC]
.text:0000000000009534 BL sub_971C
.text:0000000000009538 ; ---------------------------------------------------------------------------
.text:0000000000009538
.text:0000000000009538 loc_9538 ; CODE XREF: .text:00000000000094EC↑j
.text:0000000000009538 BL .__stack_chk_fail
.text:0000000000009538 ; } // starts at 932C
.text:0000000000009538 ; END OF FUNCTION CHUNK FOR main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
.text:00000000000091C0 sub_91C0 ; CODE XREF: main+100↓p
.text:00000000000091C0
.text:00000000000091C0 var_50 = -0x50
.text:00000000000091C0 var_48 = -0x48
.text:00000000000091C0 var_40 = -0x40
.text:00000000000091C0 var_2D = -0x2D
.text:00000000000091C0 var_1C = -0x1C
.text:00000000000091C0 var_18 = -0x18
.text:00000000000091C0 var_10 = -0x10
.text:00000000000091C0 var_8 = -8
.text:00000000000091C0 var_s0 = 0
.text:00000000000091C0
.text:00000000000091C0 ; __unwind { // sub_AA24
.text:00000000000091C0 SUB SP, SP, #0x70
.text:00000000000091C4 STP X29, X30, [SP,#0x60+var_s0]
.text:00000000000091C8 ADD X29, SP, #0x60
.text:00000000000091CC MRS X8, #3, c13, c0, #2
.text:00000000000091D0 LDR X8, [X8,#0x28]
.text:00000000000091D4 STUR X8, [X29,#var_8]
.text:00000000000091D8 STUR W0, [X29,#var_1C]
.text:00000000000091DC MOV W0, #0x10
.text:00000000000091E0 BL sub_A138
.text:00000000000091E4 MOV X8, X0
.text:00000000000091E8 MOV W9, #1
.text:00000000000091EC STURB W9, [X29,#var_2D]
.text:00000000000091F0 SUB X30, X29, #-var_18
.text:00000000000091F4 STR X0, [SP,#0x60+var_40]
.text:00000000000091F8 MOV X0, X30
.text:00000000000091FC STR X8, [SP,#0x60+var_48]
.text:0000000000009200 STR X30, [SP,#0x60+var_50]
.text:0000000000009204 BL nullsub_2
.text:0000000000009208 ADRP X1, #a12345@PAGE ; "12345"
.text:000000000000920C ADD X1, X1, #a12345@PAGEOFF ; "12345"
.text:0000000000009210 SUB X0, X29, #-var_10
.text:0000000000009214 LDR X2, [SP,#0x60+var_50]
.text:0000000000009218 BL sub_2DCFC
.text:000000000000921C B loc_9220
.text:0000000000009220 ; ---------------------------------------------------------------------------
.text:0000000000009220
.text:0000000000009220 loc_9220 ; CODE XREF: sub_91C0+5C↑j
.text:0000000000009220 SUB X1, X29, #-var_10
.text:0000000000009224 LDR X0, [SP,#0x60+var_40]
.text:0000000000009228 BL sub_1E328
.text:000000000000922C B loc_9230
.text:0000000000009230 ; ---------------------------------------------------------------------------
.text:0000000000009230
.text:0000000000009230 loc_9230 ; CODE XREF: sub_91C0+6C↑j
.text:0000000000009230 MOV W8, WZR
.text:0000000000009234 STURB W8, [X29,#var_2D]
.text:0000000000009238 ADRP X1, #_ZTISt13runtime_error@PAGE ; `typeinfo for'std::runtime_error
.text:000000000000923C ADD X1, X1, #_ZTISt13runtime_error@PAGEOFF ; `typeinfo for'std::runtime_error
.text:0000000000009240 ADRP X2, #off_65E40@PAGE
.text:0000000000009244 LDR X2, [X2,#off_65E40@PAGEOFF]
.text:0000000000009248 LDR X0, [SP,#0x60+var_48]
.text:000000000000924C BL sub_B140
.text:000000000000924C ; End of function sub_91C0
.text:000000000000924C
.text:0000000000009250 ; ---------------------------------------------------------------------------
.text:0000000000009250 B loc_9328
.text:0000000000009254 ; ---------------------------------------------------------------------------
.text:0000000000009254 MOV W8, W1
.text:0000000000009258 STUR X0, [X29,#-0x28]
.text:000000000000925C STUR W8, [X29,#-0x2C]
.text:0000000000009260 B loc_927C
.text:0000000000009264 ; ---------------------------------------------------------------------------
.text:0000000000009264 SUB X8, X29, #0x10
.text:0000000000009268 MOV W9, W1
.text:000000000000926C STUR X0, [X29,#-0x28]
.text:0000000000009270 STUR W9, [X29,#-0x2C]
.text:0000000000009274 MOV X0, X8
.text:0000000000009278 BL loc_2DF40
.text:000000000000927C
.text:000000000000927C loc_927C ; CODE XREF: .text:0000000000009260↑j
.text:000000000000927C SUB X0, X29, #0x18
.text:0000000000009280 BL nullsub_11
.text:0000000000009284 LDURB W8, [X29,#-0x2D]
.text:0000000000009288 AND W8, W8, #1
.text:000000000000928C TBZ W8, #0, loc_9298
.text:0000000000009290 LDR X0, [SP,#0x18]
.text:0000000000009294 BL sub_A230
.text:0000000000009298
.text:0000000000009298 loc_9298 ; CODE XREF: .text:000000000000928C↑j
.text:0000000000009298 B loc_929C
.text:000000000000929C ; ---------------------------------------------------------------------------
.text:000000000000929C
.text:000000000000929C loc_929C ; CODE XREF: .text:loc_9298↑j
.text:000000000000929C LDUR W8, [X29,#-0x2C]
.text:00000000000092A0 MOV W9, #1
.text:00000000000092A4 CMP W8, W9
.text:00000000000092A8 B.NE loc_9320
.text:00000000000092AC LDUR X0, [X29,#-0x28]
.text:00000000000092B0 BL sub_A304
.text:00000000000092B4 STR X0, [SP,#0x28]
.text:00000000000092B8 ADRP X0, #off_65C60@PAGE
.text:00000000000092BC LDR X0, [X0,#off_65C60@PAGEOFF]
.text:00000000000092C0 ADRP X1, #aFCatch@PAGE ; "f-catch"
.text:00000000000092C4 ADD X1, X1, #aFCatch@PAGEOFF ; "f-catch"
.text:00000000000092C8 BL sub_1DC6C
.text:00000000000092CC STR X0, [SP,#8]
.text:00000000000092D0 B loc_92D4
.text:00000000000092D4 ; ---------------------------------------------------------------------------
.text:00000000000092D4
.text:00000000000092D4 loc_92D4 ; CODE XREF: .text:00000000000092D0↑j
.text:00000000000092D4 MOV W1, #0xA
.text:00000000000092D8 LDR X0, [SP,#8]
.text:00000000000092DC BL sub_1DC48
.text:00000000000092E0 STR X0, [SP]
.text:00000000000092E4 B loc_92E8
.text:00000000000092E8 ; ---------------------------------------------------------------------------
.text:00000000000092E8
.text:00000000000092E8 loc_92E8 ; CODE XREF: .text:00000000000092E4↑j
.text:00000000000092E8 BL sub_A3A4
.text:00000000000092EC MRS X8, #3, c13, c0, #2
.text:00000000000092F0 LDR X8, [X8,#0x28]
.text:00000000000092F4 LDUR X9, [X29,#-8]
.text:00000000000092F8 CMP X8, X9
.text:00000000000092FC B.NE loc_9328
.text:0000000000009300 MOV W0, #1
.text:0000000000009304 LDP X29, X30, [SP,#0x60]
.text:0000000000009308 ADD SP, SP, #0x70
.text:000000000000930C RET
.text:0000000000009310 ; ---------------------------------------------------------------------------
.text:0000000000009310 MOV W8, W1
.text:0000000000009314 STUR X0, [X29,#-0x28]
.text:0000000000009318 STUR W8, [X29,#-0x2C]
.text:000000000000931C BL sub_A3A4
.text:0000000000009320
.text:0000000000009320 loc_9320 ; CODE XREF: .text:00000000000092A8↑j
.text:0000000000009320 LDUR X0, [X29,#-0x28]
.text:0000000000009324 BL sub_42344
.text:0000000000009328
.text:0000000000009328 loc_9328 ; CODE XREF: .text:0000000000009250↑j
.text:0000000000009328 ; .text:00000000000092FC↑j
.text:0000000000009328 BL .__stack_chk_fail
.text:0000000000009328 ; } // starts at 91C0