程式機器級表示 4 條件控制

2021-09-10 01:25:05 字數 1247 閱讀 4935

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...