汇编语言笔记(三): 标志寄存器
章節(jié)目錄
作者能力有限, 如果您在閱讀過程中發(fā)現(xiàn)任何錯誤, 還請您務必聯(lián)系本人,指出錯誤, 避免后來讀者再學習錯誤的知識.謝謝!
簡介
8086 CPU 寄存器的結(jié)構(gòu)如下如:
每個標志寄存器都有它特殊的含義,下面我們將一一介紹他們的含義及用途.
ZF
ZF 稱為零標志位(Zero Flag). 它記錄了相關指令執(zhí)行后, 其結(jié)果是否為 0. 如果結(jié)果為 0, 則 ZF=1; 如果結(jié)果不為 0, 則 ZF = 0. 至于哪些指令的執(zhí)行會影響 ZF 標記位, 則要參考該指令的說明了.
示例:
mov ax, 1sub ax, 1// 執(zhí)行上述指令之后, ZF = 1mov ax, 2sub ax, 1// 執(zhí)行上述指令之后, ZF = 0PF
PF 稱為奇偶標記位(Parity Flag). 它記錄了執(zhí)行相關指令之后, 其結(jié)果的所有 bit 中 1 的個數(shù)是否為偶數(shù). 如果 1 的個數(shù)為偶數(shù)個, 則 PF = 1; 如果為奇數(shù)個, 則 PF = 0. (0 是偶數(shù), 因此,如果某個指令執(zhí)行之后結(jié)果為 0 且該指令會影響 PF 標志位, 此時 PF = 1),
示例:
mov al, 1add al, 10// 執(zhí)行上述指令之后, 結(jié)果為 00001011B, 有三個 '1', 則 PF = 0mov al, 1add al, 11// 執(zhí)行上述指令之后, 結(jié)果為 00001100B, 有四個 '1', 則 PF = 1SF
SF 稱為符號標記位(Sign Flag). 它記錄了執(zhí)行相關指令之后, 其結(jié)果是否為負數(shù). 如果是負數(shù), 則 SF = 1; 如果不為負數(shù), 則 SF = 0.
CF
CF 稱為進位寄存器(Carry Flag). 一般情況下, 在進行無符號數(shù)運算的時候, 它記錄了運算結(jié)果的最高有效位向更高位的進位值, 或從更高位的借位值.
比如, 我們要計算 98H 加 98H 的兩個八位數(shù)據(jù), 計算結(jié)果為 130H. 而 120H 超過了八位寄存器所能存儲的最大值, 因此會產(chǎn)生進位.
mov al, 98Hadd al, al // 執(zhí)行上述指令之后, AL = 30H, CF = 1. add al, al // 執(zhí)行這條指令之后, AL = 60H, CF = 0同樣的, 當我們要計算 98H 減去 99H 時, 就需要借位.
mov al, 98Hsub al, 99H // 執(zhí)行這條指令之后, AL = FFH, CF = 1. sub al, al // 執(zhí)行這條指令之后, AL = 00H, CF = 0.ADC 指令
ADC 是帶進位加法指令. 它利用了 CF 標志位上記錄的進位值.
指令格式: adc num1, num2
功能: num1 = num1 + num2 + CF
示例:
mov ax, 2mov bx, 1sub bx, axadc ax, 1// 執(zhí)行上述指令之后, ax = 4. // adc ax, 1 等價于 ax + 1 + CF = 2 + 1 + 1 = 4.SBB 指令
SBB 是帶借位減法, 它利用了 CF 標志位上記錄的借位值.
指令格式: sbb num1, num2
功能: num1 = num1 - num2 - CF
示例:
mov bx, 1000Hmov ax, 003EHsub bx, 2000Hsbb ax, 0020H // sbb ax, 0020H1 等價于 ax - 0020H - CF.OF
OF 稱為溢出標志位(Overflow Flag). 一般情況, OF 記錄了有符號數(shù)運算結(jié)果是否發(fā)生了溢出. 如果發(fā)生溢出, 則 OF = 1; 如果沒有溢出, 則 OF = 0.
mov al, 98add al, 99 // 執(zhí)行上述指令之后, 則會發(fā)生溢出. 8 位寄存機能存儲的值的范圍為 -128-127. // 98 + 99 = 197. 197 超出了 8 位寄存器的存儲范圍. 因此, CF = 0, OF = 1.這里注意 CF 和 OF 的區(qū)別:
CF 對無符號數(shù)運算有意義
OF 對有符號數(shù)運算有意義
幾條相關指令
CMP 指令
指令格式: cmp num1, num2
功能: 計算 num1 - num2 但不保存結(jié)果. 但根據(jù)計算結(jié)果對標志寄存進行設置.
示例:
mov ax, 8mov bx, 3cmp ax, bx// 執(zhí)行上述指令之后, ZF = 0, PF = 1, SF = 0, CF = 0, OF = 0常用相關指令
| JE | 等于則轉(zhuǎn)移 | ZF=1 |
| JNE | 不等于則轉(zhuǎn)移 | ZF=0 |
| JB | 小于則轉(zhuǎn)移 | CF=1 |
| JNB | 大于等于則轉(zhuǎn)移 | CF=0 |
| JA | 大于則轉(zhuǎn)移 | CF=0 && ZF = 0 |
| JNA | 小于等于則轉(zhuǎn)移 | CF=1 && ZF = 1 |
DF
DF 稱為方向標志位(Direction Flag). 在串處理指令中, 控制每次操作后 SI, DI 的增減.
DF = 0 每次操作后 SI, DI 遞增
DF = 1 每次操作后 SI, DI 遞減
PUSHF and POPF
PUSHF 的功能是將標志寄存器的值壓棧
POPF 的功能室將標志寄存器的值出棧, 送入標志寄存器中.
歡迎交流任何想法.
End…
總結(jié)
以上是生活随笔為你收集整理的汇编语言笔记(三): 标志寄存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode No.2 两数相加
- 下一篇: leetcode No.123 买卖股票