DEBUG版本下的三种循环表现形式
do ... while
在汇编中表现的形式和if十分相似,不同的地方在于if是一个向下跳的结构,do...while是一个向上跳的过程。
代码定式:
DO_BEGIN:
........ ;循环语句块
jxx DO_BEGIN
DO_END:
while
while和do...while相反,执行循环语句块之前,必须要进行条件判断,根据比对结果选择是否执行循环语句块。
while循环里会有两次跳转
第一次:条件判断(反条件)是否执行循环体
-
第二次:无条件向上跳
代码定式:WHILE_BEGIN: jxx WHILE_END ...... ;循环体 jmp WHILE_BEGIN WHILE_END:
FOR
for循环由赋初始值,设置循环条件,设置循环步长三步组成,同事debug版本的代码由三跳组成。
第一跳:条件比较(反条件)跳转
-
第二跳,第三跳:jmp跳转
代码定式:mov mem/reg, xxx ;赋值 jmp FOR_CMP FOR_STEP: ........ ;修改循环变量 FOR_CMP: ........ ;循环条件判定 jxx FOR_END FOR_BODY: ....... ;循环体 jmp FOR_STEP FOR_END:
RELEASE版本对循环的三种优化
第一种
如果while或for中的条件判断环节在常量扩散优化后必成立,优化成do...while
do...while只使用一次跳转,大大提高了效率
如果循环条件不能预知,会优化成if里套一个do...while
if
{
do
{
}whiel(...)
}
结果从两跳优化成了一跳,大大提高了效率,还原的时候判断if的条件和do...while的条件是否具有相关性来酌情还原成while或for
第二种
代码外提
有利于流水线的优化,如果循环条件和循环体代码无关,那么条件代码会外提,循环条件里如果有函数,编译器不会做任何优化,只能人工优化。
第三种
强度削弱优化
只有一种情况会触发
循环体里的乘法结果呈线性增长,优化成加法。
continue和break的区别
- continue:上跳,还在循环块内
- break:下跳,出循环体