cpu通過條件碼的檢測來執行條件分支指令,最常用的條件碼有
cf:進製。最近的操作使最高位產生了進製
zf:零標誌。最近的操作得出結果為0
sf:最近操作得出結果為負數
of:溢位,最近操作導致補碼溢位-正溢位或負溢位
除leaq指令,一般都會設定條件碼
值得注意的時cmp和test兩類指令,它們只設定條件碼不改變其他暫存器。cmp指令和sub指令一樣。test指令行為和and指令行為一樣。
條件碼第一種使用方式是根據條件碼某個組合,將乙個位元組設定為0或1,一般將這一整類指令稱為set指令。
一般會利用cmp*** + set***的形式設定。
如cmp:
cmpq %rsi, %rdi #比較
setl %al #小於時設定%eax的低階為1
movzbl %al,%eax
ret條件碼第二種使用方式是條件跳轉,分有條件跳轉和無條件跳轉,具體jmp跳轉指令可查閱
無條件直接跳轉
movq $0,%rax
jmp .l1
movq (%rax),%rdx#這行直接跳掉不執行
.l1:
popq %rdx
無條件間接跳轉
例子jmp *%rax用暫存器%rax的值作為跳轉目標
jmp *(%rax)以%rax的值作為讀位址,從記憶體中讀出跳轉目標
有條件跳轉
為了便於理解彙編的有條件跳轉,我們通常可以將對應的c語言的if語句改寫成goto版本
這裡用乙個絕對值的例子解釋一下
原始版本:
long lt_cnt=0;
long ge_cnt=0;
long absdiff_se(long x, long y)
else
return result;
}對應的goto 版本
long absdiff_se(long x, long y)
其對應的彙編版本
absdiff_se:
cmpq %rsi, %rdi
jge .l2
addq $1, lt_cnt(%rip)
movq %rsi,%rax
subq %rdi,%rax
ret.l2:
addq $1, ge_cnt(%rip)
movq %rdi, %rax
subq %rsi, %rax
ret
程式的機器級表示二(控制)
目錄 1.條件碼 2.跳轉指令 3.條件傳送指令 4.switch語句 實現有條件的行為 lea mov指令不設定條件碼 比較和測試指令 cmp類似 sub 指令的行為,只設定條件碼而不更新目標暫存器。test類似and,只設定條件碼而不更新目標暫存器。訪問條件碼 用法 條件碼組合,設定某個位元組 ...
4 條件查詢
dql語言 二 條件查詢 1.基本語法 select 查詢列表 from 表名where 篩選條件 執行步驟依次是 先 from 表名 再 where 篩選條件 最後 select 查詢列表 去顯示符合條件的字段列表.2.篩選條件的分類 一 按條件表示式篩選 基礎條件運算子 ps 也是表示 不等於 ...
五 條件控制語句
執行流程 如果為false,則不執行。例如 num 50 if num 20 print num比20大 輸出 num比20大 語法 if 條件表示式 塊input rint 123 輸出 123username input if usename admin 輸出 沒有提示 admin userna...