#跳轉指令
有符號
無符號
低版本優化
10!=5
?5:7
;變數 != a ? b : c 且 b < c
sub reg,a ;如果a為0 則這一步省略
neg reg ;對變數求補(二進位製取反+
1),正變負,負變正
sbb reg,reg ;當初始reg為非0則值為-
1,否則為0
and reg,c-b ;如果為真則 reg = b-c
add reg,c
;變數 >= a ? b : c 且 b < c
cmp reg, a
setl al ;小於則al為 1
dec reg ;判斷為真 reg =
0 ,否則reg =-1
and reg,c-b ;如果為真則 reg =
0 否則reg = b-c
add reg,c ;如果為真則為c 否則 reg = c + b - c = b
高版本優化;條件傳送指令cmovxx
cmovx source, destination
其中 x 是乙個或者連個字母的**,表示將觸發傳送操作的條件。
條件取決於 eflags 暫存器的當前值
;變數 == a ? b : c 且 b > c
mov reg1, b
test reg, a ;判斷變數與a是否相等
mov reg, c
cmovz reg, reg1 ;條件滿足則傳送(賦值)一次 reg = b=reg1 否則 reg = c
;案例printf
("%d\n"
, edi ==0?
67:-88
);mov ecx,
67
test edi, edi ;這裡直接影響zf標誌位
mov eax,-88
cmovz eax, ecx ;若果相等 則eax =
67 否則為-
88push eax
push offset unk_4020f8
call printf
單分支結構jxx if_end:..
;中間為條件體
.;注意語句上面無跳轉
if_end
雙分支結構;第一種 被優化成單分支結構 減少分支
jxx if_end:..
;中間為條件體
.;注意語句上面無跳轉
if_end
;案例if
(argc == nnumber)
else
return nnumber;
;編譯器最後優化成
if(argc == nnumber)
printf
("%d"
,nnumber /5)
;return nnumber;
定式
jxx else_begin:..
.if_end:
jmp else_end:
else_begin ;注意上方為向下跳轉至結尾..
.else_end:
條件語句和三目運算子的區別
剛入職那會,編寫 一直都是用 條件語句。後來都不用條件判斷了,而直接改用三目運算子了。三目運算子condition expr1 expr2 condition or conditions 計算結果為true或false的表示式。expr1,expr2值可以是任何型別的表示式。下面先看一段案例。第一種...
C 條件運算子(三目運算子)
在某些情況下,可以用條件運算子 來簡化if語句。是乙個三元運算子,其構成的表示式格式為 表示式1 表示式2 表示式3 條件運算子的執行流程示意圖如上圖所示,描述如下 1 計算表示式1的值 2 若表示式的值為真 或非0 則只計算表示式2,並將其結果作為整個表示式的值 反之,即表示式1的值為假 或為0 ...
C 條件運算子(三目運算子)
在某些情況下,可以用條件運算子 來簡化if語句。基本格式 是乙個三元運算子,其構成的表示式格式為 表示式1 表示式2 表示式3 執行流程 條件運算子的執行流程示意圖如上圖所示,描述如下 1 計算表示式1的值 2 若表示式的值為真 或非0 則只計算表示式2,並將其結果作為整個表示式的值 反之,即表示式...