1. 程式人生 > 其它 >組合語言程式設計(十一)標誌暫存器

組合語言程式設計(十一)標誌暫存器

目錄

引言

  • 8086CPU的標誌暫存器有16位,其中儲存的資訊被稱為程式狀態字,PSW
  • 一般暫存器都是用於存放資料,暫存器中存放的資料有一個完整的意義,標誌暫存器則是按位起作用的,即標誌暫存器的每一位都有專門的含義,記錄特定的資訊。

flag暫存器標誌位介紹

ZF標誌,零標誌位

  • 是flag暫存器的第6位,它記錄相關指令執行後的結果資訊:
    ** 如果結果為0,則ZF=1
    ** 如果結果不為0,則ZF=0
  • 8086CPU指令集中,像add,sub,mul,div,inc,or,and等運算指令,其執行結果是直接影響標誌暫存器的
  • 像mov,push,pop等傳送指令,其操作對標誌暫存器沒有影響

PF標誌,奇偶標誌位

  • flag暫存器的第2位,它記錄指令執行後,結果的所有二進位制位中1的個數:
    ** 如果1的個數是偶數,PF=1
    ** 如果1的個數的奇數,PF=0

SF標誌,符號標誌位

  • flag暫存器的第7位,它記錄指令執行結果的正負資訊:
    ** 結果為負,SF=1
    ** 結果為正,SF=0
  • 我們知道同一個二進位制表示可以代表有符號數也可以代表無符號數,因此同一種表示看成無符號數可能是正的,看成有符號數則可能是負的,看成正的或負的不是由計算機決定的,而是由程式設計師決定的。但是SF標誌位將所有的計算結果都當成有符號數運算,因此,如果程式設計師需要有符號數,那麼通過SF標誌位可以得知結果的正負,如果程式設計師需要無符號數運算,那麼忽略SF標誌位就行了,它已經沒了卵用。

CF標誌位,進位標誌位

  • flag暫存器的第0位,它記錄了無符號數運算的時候,運算結果的最高有效位向更高位的進位值(加法),或從更高位的借位值(減法)。

OF標誌,溢位標誌位

  • 上邊CF標誌位記錄的是無符號運算的結果資訊,這裡OF則是有符號運算的結果資訊,也就是說,只有有符號運算才有溢位的概念
    ,當有符號數運算結果超出機器表示範圍的時候就稱為溢位。
  • 溢位是對有符號數運算而言的,進位是對無符號數運算而言的,看待問題的角度不同。
  • 計算機是分不清有符號還是無符號運算的,當我們將其看成無符號運算時,就看CF位是否產生進位,當我們將其看成有符號運算時,要看OF和SF兩個位,來看是否溢位以及結果的符號。

adc指令

  • 帶進位加法指令,其進行加法運算的時候會加上上一次運算的進位值,即CF標誌位的值。
  • 格式 adc ax, bx
  • 實現功能 (ax) = (ax) + (bx) + CF

  • adc指令和add指令配合可以實現更大的的資料加法運算,而不必丟棄進位。
  • inc和loop指令不影響CF位的值

sbb指令

  • 帶借位減法指令,利用了CF位上的借位值
  • 格式 sbb ax, bx
  • 實現功能 (ax) = (ax) - (bx) - CF
  • 利用sbb指令可以對任意大的資料進行減法運算。

cmp指令

  • cmp指令功能是做減法,但是不儲存減法的結果,而是通過影響標誌位來記錄下表示的資訊。即cmp指令通過做減法運算影響標誌位暫存器,標誌位暫存器的相關位記錄了比較的結果。
  • 格式 cmp 操作物件1,操作物件2
  • 功能 計算 操作物件1 - 操作物件2,但是不儲存結果,僅僅根據計算結果對標誌暫存器進行設定。

無符號數比較

有符號數比較





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

  • 根據cmp指令的比較結果,來進行跳轉工作的指令,即條件轉移指令。即條件轉移指令通過檢測那些被cmp指令影響的標誌位來進行相關跳轉工作。

根據無符號數比較結果進行轉移的條件轉移指令

  • 這些指令檢測ZF、CF的值

根據有符號數比較結果進行轉移的條件轉移指令

  • 這些指令檢測SF、OF、ZF的值

DF標誌和串傳送指令movsb

  • flag的第10位是DF,方向標誌位,其作用是在串處理指令中,控制每次操作後si、di的增減。

  • DF=0,每次操作後si,di遞增

  • DF=1,每次操作後si,di遞減

  • 格式:movsb,不需要運算元

  • 功能如下:

  • movsb的功能是將ds:si指向的記憶體單元中的位元組送入es:di中,然後根據標誌暫存器DF位的值,將si和di遞增或遞減

  • movsb是傳送一個位元組,如果需要傳送一個字,只需要改成movsw

  • rep movsb可以傳送任意個位元組到任意記憶體地址處,這裡的rep根據迴圈計數器cx中的值來重複執行後邊的movsb指令,由於每次執行後si和di都會遞增或遞減,因此rep movsb就可以實現(cx)個字元的傳送。

  • DF標誌位的設定,cld指令設定為0,std指令設定為1