1. 程式人生 > 其它 >組合語言 第十一章 標誌暫存器

組合語言 第十一章 標誌暫存器

標誌暫存器 flag

標誌暫存器只有一個,16位,有9個標誌位,除第1位為1外,剩餘6個位置預設為0,未被使用。

  • 0-CF (carry flag進位標誌) (CY: CF = 1; NC:CF = 0)(carry、no carry)判斷過程是否有進位或者借位,cf = 1表示有進位或借位,cf = 0表示沒有。cf的標誌只對無符號數有意義。inc指令和dec指令不影響CF位
  • 2-PF(parity flag奇偶標誌)(PE:PF = 1; PO:PF = 1)(even、odd)判斷結果的所有位中1的個數是否為偶數,pf = 1表示1的個數為偶數;pf = 0表示1的個數為奇數,注意不是判斷數本身的奇偶,而是1的個數的奇偶。  
  • 4-AF(auxiliary flag輔助標誌)(AC:AF = 1; NA :AF = 0)(AC、NO AC)  
  • 6-ZF(zero flag零標誌)(ZR:ZF = 1; NZ:ZF = 0)(zero、not zero) 判斷結果是否為0,zf = 1表示結果為0;zf = 0表示結果為1。
  • 7-SF(sign flag符號標誌)(NG:SF = 1; PL:SF = 0)(negative、positive)判斷結果是否為負,sf = 1表示結果為負;sf = 0表示結果非負(判斷依據是最高位是否為1)如果把資料當作無符號數,SF的值沒有意義,雖然相關指令影響了SF的值。
  • 8-TF(trap flag陷阱標誌)
  • 9-IF(iinterrupt flag中斷標誌)(EI:IF = 1;DI:IF = 0)(enabled、disabled
  • 10-DF(direction flag方向標誌)(DN:DF = 1; UP:DF = 0)(decrement、increment)控制每次操作後si、di的增減(為1時減,decrease),df = 0 每次操作後si、di遞增;df = 1 每次操作後si、di遞減。cld指令將df復位0,std指令將df置1
  • 11-OF(overflow flag溢位標誌)(OV:OF = 1; NV:OF = 0)(overflow、not overflow)兩個有符號數的運算:將運算全部轉換成加,正+負不會產生溢位;負+負變成正,正加正變成負產生溢位 of的溢位只對有符號數有意義

起標誌作用,用來儲存某些指令的執行結果 或者 為執行某些指令提供依據

只有運算指令對標誌暫存器有影響(add、sub、mul、div、inc、dec、or、and、xor)(加減乘除、自增自減、與、或、異或)。

mov、push、pop等傳送指令對標誌暫存器沒有影響

adc指令

帶進位加法指令,指令格式:adc 操作物件1,操作物件2 功能:操作物件1 = 操作物件1 + 操作物件2 + CF

加法可以分兩步來進行:①低位相加;②高位相加再加上低位相加產生的進位值; 利用adc指令,可以實現任意位數的加法。

sbb指令

帶借位減法指令,指令格式:sbb 操作物件1,操作物件2 功能:操作物件1 = 操作物件1 - 操作物件2 - CF

cmp比較指令:

指令格式:cmp 操作物件1,操作物件2 功能:計算操作物件1 - 操作物件2 ,但並不保留結果,不改變操作物件的值,只對標誌位有影響。

cmp ax,bx可能產生的6種情況以及對應的轉移指令:

  • (ax) = (bx),則zf = 1; 對應指令為 je 等於則轉移(equal)
  • (ax) ≠ (bx),則zf = 0; 對應指令為jne 不等於則轉移(not equal)
  • (ax) < (bx),則cf = 1; 對應指令為jb 小於則轉移(below)
  • (ax) ≥ (bx),則cf = 0; 對應指令為jnb 不小於則轉移(not below)
  • (ax) > (bx),則cf = 0且zf = 0; 對應指令為ja 大於則轉移(above)
  • (ax) ≤ (bx),則cf = 1或zf = 1; 對應指令為jna 不大於則轉移(not above)(是否轉移完全由對應標誌位決定,即使兩數關係不一定如此)

根據sf、of判斷大小:

  • sf = 1, of = 0,則ax < bx
  • sf = 1, of = 1,則ax > bx
  • sf = 0, of = 0,則ax ≥ bx
  • sf = 0, of = 1,則ax < bx (無溢位時,關係正常;有溢位時,關係相反且不能取等)

串傳送指令movsb:

b表示Byte,一次傳送一個位元組。格式:movsb 功能:將ds:[si]的內容複製到es:[di],同時根據df的值增減si和di movsw是傳送一個位元組

一般來說傳送的都是較長單位,所以常與rep(repeat)配合使用。 rep movsb == s:movsb loops,迴圈的次數由cx控制,一次傳送cx個位元組。

使用串傳送指令的四個要素:

  1. 傳送的原始位置:ds:si
  2. 傳送的目的位置:es:di
  3. 傳送長度:cx
  4. 傳送方向:df

pushf和popf:

  • pushf:將標誌暫存器的值壓棧(push flag)
  • popf:從棧中彈出資料,送入標誌暫存器中(pop flag)