天天看點

彙編語言-标志寄存器

标志寄存器

8086CPU的标志寄存器有16位,其中存儲的資訊通常被稱為程式狀态字(PSW)。flag寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的資訊。

8086CPU的flag寄存器中的結構如圖:

彙編語言-标志寄存器

ZF 标志

  • flag的第6位是ZF,零标志位。它記錄相關指令執行後,其結果是否為0.如果結果為0,那麼zf=1;如果結果不為0,那麼zf=0。
  • 在8086CPU的指令集中,有的指令的執行是影響标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它們大都是運算指令(進行邏輯或算術運算);
  • 有的指令的執行對标志寄存器沒有影響,比如:mov、push、pop等,它們大都是傳送指令。

PF 标志

  • flag的第2位是PF,奇偶标志位。它記錄指令執行後,結果的所有二進制位(最低有效字)中1的個數:為偶數,PF = 1;為奇數,PF = 0。

SF 标志

  • flag的第7位是SF,符号标志位。它記錄指令執行後,結果為負,SF = 1;結果為正,SF = 0。
  • 對于同一個二進制資料,計算機可以将它當作無符号資料來運算,也可以當作有符号資料來運算,實際上無關緊要,重要的是使用者如何看待。
  • 我們可以将add指令進行的運算當作無符号數的運算,那麼add指令相當于計算129+1,結果為130(10000010B);
  • 也可以将add指令進行的運算當作有符号數的運算,那麼add指令相當于計算-127+1,結果為-126(10000010B)。
  • 如果我們将資料當作無符号數來運算,SF的值則沒有意義,雖然相關的指令影響了它的值。

CF 标志

  • Flag的第0位是CF,進位标志位。一般情況下,在進行無符号數運算的時候,它記錄了運算結果的最高有效位向更高位的進位值,或從更高位的借位值。
  • 一種情況是兩個資料做加法産生了最高位的進位,另外一種情況,當兩個資料做減法的時候,有可能向更高位借位。

OF 标志

  • 在進行有符号數運算的時候,如結果超過了機器所能表示的範圍稱為溢出。
  • CF是對無符号數運算有意義的标志位;而OF是對有符号數運算有意義的标志位。

adc 指令

adc是帶進位加法指令 ,它利用了CF位上記錄的進位值。

  • 格式: adc 操作對象1,操作對象2
  • 功能:操作對象1=操作對象1+操作對象2+CF
  • 比如指令adc ax,bx 實作的功能是:(ax)=(ax)+(bx)+CF

使用adc可以對任意大的資料進行加法運算。

sbb 指令

sbb是帶錯位減法指令,它利用了CF位上記錄的借位值。

  • 格式:sbb 操作對象1,操作對象2
  • 功能:操作對象1=操作對象1–操作對象2–CF
  • 比如指令sbb ax,bx實作功能: (ax) = (ax) – (bx) – CF

使用sbb指令我們可以對任意大的資料進行減法運算。

cmp

cmp 是比較指令,功能相當于減法指令,隻是不儲存結果。cmp 指令執行後,将對标志寄存器産生影響。

  • 格式:cmp 操作對象1,操作對象2
  • 功能:計算操作對象1–操作對象2 但并不儲存結果,僅僅根據計算結果對标志寄存器進行設定。

檢測比較結果的條件轉移指令

彙編語言-标志寄存器
  • e:表示equal;
  • ne:表示not equal;
  • b:表示below;
  • nb:表示not below;
  • a:表示above;
  • na:表示not above。

DF 标志和串傳送指令

flag的第10位是DF,方向标志位。在串處理指令中,控制每次操作後si,di的增減。

  • DF = 0:每次操作後si,di遞增;
  • DF = 1:每次操作後si,di遞減。
  • 格式: movsb(w) ;
  • 功能:(以位元組為機關傳送)。
((es)×16 + (di)) = ((ds) ×16 + (si))
如果DF = 0則:
	(si) = (si) + 1
	(di) = (di) + 1
如果DF = 1則:
	(si) = (si) - 1
	(di) = (di) - 1
           

movsb和movsw進行的是串傳送操作中的一個步驟,一般來說,movsb 和 movsw 都和rep配合使用,格式如下:

rep movsb。 ;rep的作用是根據cx的值,重複執行後面的串傳送指令。
           

8086CPU提供下而兩條指令對DF位進行設定:

  • cld指令:将标志寄存器的DF位置0
  • std指令:将标志寄存器的DF位置1

pushf 和 popf

  • pushf :将标志寄存器的值壓棧;
  • popf :從棧中彈出資料,送入标志寄存器中

繼續閱讀