汇编语言中常用指令对标志位寄存器的影响
參考了《匯編語言 基于x86處理器》第七版
轉載請注明出處
如果有錯誤的地方請指正,謝謝。
文章目錄
- 算術運算(ADD/SUB)影響標志位
- ADD指令
- SUB指令
- NEG指令
- INC/DEC指令影響標志位
- INC指令
- DEC指令
- 布爾指令影響標志位
- AND指令
- OR指令
- NOT指令
- XOR指令
- TEST指令
- 移位指令影響標志位
- 邏輯移位(SHL/SHR)
- 算術移位(SAL/SAR)
- 循環移位(ROL/ROR)
- 帶進位的循環移位(RCL/RCR)
- 雙精度移位(SHLD/SHRD)
- 乘/除法影響標志位
- 無符號乘法(MUL)
- 有符號乘法(IMUL)
- 單操作數
- 雙操作數
- 三操作數
- 無符號除法(DIV)
- 有符號除法(IDIV)
算術運算(ADD/SUB)影響標志位
ADD指令
有符號:
兩數相加,如果超過有符號數最大取值范圍時(如8位有符號數大于127),OF置位。
無符號:
兩數相加,如果超過無符號數最大取值范圍時(如8位無符號數最大取255)CF置位。
?????????根據目標操作數修改:OF/CF/ZF/SF/AF/PF
示例:-128-1執行后,CF標志位與OF標志位分別是多少? CF=0 OF=1
SUB指令
有符號:
兩數相減,如果超過有符號數最小取值范圍時(如8位有符號數小于-128),OF置位。
無符號:
兩數相減,如果被減數小于減數,CF置位。
?????????根據目標操作數修改:OF/CF/ZF/SF/AF/PF
示例:-128+1執行后,CF標志位與OF標志位分別是多少? CF=0 OF=0
NEG指令
- NEG是匯編指令中的求補指令,NEG指令對操作數執行求補運算:用零減去操作數,然后結果返回操作數。求補運算也可以表達成:將操作數按位取反后加1。
- 對任何非0的操作數使用NEG指令都將CF置位。
- 根據目標操作數修改:CF/OF/ZF/SF/AF/PF
INC/DEC指令影響標志位
INC指令
- 不影響進位標志位,根據目標操作數修改溢出標志位、符號標志位、奇偶標志位、零標志位,輔助進位標志位。 OF/SF/PF/ZF/AF
DEC指令
- 不影響進位標志位,根據目標操作數修改溢出標志位、符號標志位、奇偶標志位、零標志位,輔助進位標志位。 OF/SF/PF/ZF/AF
布爾指令影響標志位
布爾指令:AND/OR/NOT/XOR/TEST
AND指令
- 清除進位標志位和溢出標志位,根據目標操作數修改符號標志位、奇偶標志位、零標志位,輔助進位標志位無定義。 SF/PF/ZF
OR指令
- 清除進位標志位和溢出標志位,根據目標操作數修改符號標志位、奇偶標志位、零標志位,輔助進位標志位無定義。 SF/PF/ZF
NOT指令
- 不修改標志位
XOR指令
- 清除進位標志位和溢出標志位,根據目標操作數修改符號標志位、奇偶標志位、零標志位,輔助進位標志位無定義。 SF/PF/ZF
TEST指令
- 清除進位標志位和溢出標志位,根據目標操作數修改符號標志位、奇偶標志位、零標志位,輔助進位標志位無定義。 SF/PF/ZF
移位指令影響標志位
移位指令:邏輯移位(SHL/SHR)、算術移位(SAL/SAR)、循環移位(ROL/ROR)、帶進位的循環移位(RCL/RCR)、雙精度移位(SHLD/SHRD)
邏輯移位(SHL/SHR)
- 進位標志位為移入CF的位
- 根據目標操作數修改溢出標志位、符號標志位、零標志位、奇偶標志位,輔助進位標志位無定義。 CF/OF/SF/ZF/PF
算術移位(SAL/SAR)
- 進位標志位為移入CF的位
- 根據目標操作數修改溢出標志位、符號標志位、零標志位、奇偶標志位,輔助進位標志位無定義。 CF/OF/SF/ZF/PF
循環移位(ROL/ROR)
- 進位標志位為移入CF的位
移位次數等于1時:
如果移位后的符號與移位前的符號相反,溢出標志位置位。
移位次數大于1時:
溢出標志位無定義。
- 不修改符號標志位、零標志位、奇偶標志位、輔助進位標志位。
帶進位的循環移位(RCL/RCR)
- 進位標志位為移入CF的位
移位次數等于1時:
如果移位后的符號與移位前的符號相反,溢出標志位置位。
移位次數大于1時:
溢出標志位無定義。
- 不修改符號標志位、零標志位、奇偶標志位、輔助進位標志位。
雙精度移位(SHLD/SHRD)
-
進位標志位為移入CF的位
-
根據目標操作數修改溢出標志位、符號標志位、零標志位、奇偶標志位,輔助進位標志位無定義。
CF/OF/SF/ZF/PF
乘/除法影響標志位
包括無符號乘法(MUL)、有符號乘法(IMUL)、無符號除法(DIV)、有符號除法(IDIV)
無符號乘法(MUL)
-
如果乘積的高半部分不為0則進位標志位、溢出標志位置位。
也就是說運算結果超過無符號數最大取值范圍(如8位無符號數大于255),則進位標志位、溢出標志位置位。 -
符號標志位、零標志位、輔助進位標志位、奇偶標志位無定義。
有符號乘法(IMUL)
單操作數
- 如果乘積的高半部分不是低半部分符號位的擴展,那么進位標志位、溢出標志位置位。
- 也就是說運算結果不在8位有符號數取值范圍內(如8位有符號數取值:-27 ~ 27-1),進位標志位、溢出標志位置位。
- 符號標志位、零標志位、輔助進位標志位、奇偶標志位無定義。
雙操作數
- 按照目標操作數的大小來截取乘積,如果被丟棄的是有效位,那么進位標志位、溢出標志位置位。
- 也就是說運算結果不在8位有符號數取值范圍內(如8位有符號數取值:-27 ~ 27-1),進位標志位、溢出標志位置位。
- 符號標志位、零標志位、輔助進位標志位、奇偶標志位無定義。
三操作數
同雙操作數
無符號除法(DIV)
執行DIV或IDIV后,所有算術運算狀態標志位的值都不確定。
有符號除法(IDIV)
執行DIV或IDIV后,所有算術運算狀態標志位的值都不確定。
未完,有待添加
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的汇编语言中常用指令对标志位寄存器的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cron引起inode节点用光的情况
- 下一篇: USACO-Section1.2 Bro