日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

标记寄存器---汇编学习笔记

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 标记寄存器---汇编学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標記寄存器

CPU內部的寄存器中,有一種特殊的寄存器(對于不同的處理機,個數和結構都可能不同)具有以下3種作用

(1)用來存儲相關指令的某些執行結果。
(2)用來為CPU執行相關指令提供行為依據。
(3)用來控制CPU的相關工作方式。

這種特殊的寄存器在8086CPU中,被稱為標志寄存器(flag)。如圖:


11.1 ZF標志

flag的第6位是ZF,零標志位。它記錄相關指令執行后,其結果是否為0。如果結果為0那么zf=1;如果不為0,那么zf=0。

運算指令的執行對標志寄存器會產生影響,而傳送指令對標志寄存器不會產生影響

比如:

mov ax,1 ;不對標志寄存器產生影響 sub ab,1 ;對標志寄存器產生影響,并且zf=1

11.2 PF標志

flag的第2位是PF,奇偶標志位。它記錄相關指令執行后,其結果的所有bit位中1的個數是否為偶數。如果1的個數為偶數,pf=1,如果為奇數,那么pf=0。

比如:

mov al,1 ;不影響標志寄存器 add al,10 ;影響標志寄存器,并且1的個數為奇數,pf=0

11.3 SF標志

flag的第7位是SF,符號標志位。它記錄相關指令執行后,其結果是否為負。如果結果為負,sf=1;如果非負,sf=0。

檢測點 11.1
寫出下面指令執行后,ZF、PF、SF等標志位的值。

指令ZFPFSF
sub al,al110
mov al,1000
push ax——————
pop bx——————
add al,bl000
add al,10010
mul al011


11.4 CF標志

flag的第0位是CF,進位標志位。一般情況下,在進行無符號數運算的時候,它記錄了運算結果的最高有效位向更高位的進位值,或從更高位的借位值。如圖(加法器的Ci進位,i=7):

加法減法都會產生借位:
(1)加法比如:

mov al,98H add al,al ;執行后:(al)=30H,CF=1,CF記錄了從更高有效位向更高的進位值

(2)減法比如:

mov al,97H sub al,98H ;執行后:(al)=FFH,CF=1,CF記錄了向更高位進行借位值

11.5 OF標志

flag的第11位是OF,溢出標志位。一般情況下,OF記錄了有符號數運算的結果是否發生了溢出。如果發生溢出,OF=1;如果沒有,OF=0。

注意CF和OF的區別:CF是對無符號位數運算有意義的標志位,而OF是對有符號數運算有意義的標志位

比如:

mov al,0f0h ;有符號為-10,無符號為240 add al,78h ;有無符號都為120 ;進行無符號運算則發生溢出,進行有符號運算將不溢出 ;則cf=1,of=0

檢測點 11.2
寫出下面每條指令執行后,ZF、PF、SF、CF、OF等標志位的值。

指令CFOFSFZFPF
sub al,al00011
mov al,10h——————————
add al,90h00101
mov al,80h——————————
add al,80h11011
mov al,0fch——————————
add al,05h10000
mov al,7dh——————————
add al,0bh11000


11.6 adc指令

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

指令格式:adc 操作對象1,操作對象2
功能:操作對象1=操作對象1+操作對象2+CF

例子:
編程,計算1EF000H+201000H,結果放在ax(高16位)和bx(低16位)中。

mov ax,001eh mov bx,0f000h add bx,1000h ;標志寄存器cf置1 adc ax,0020h ;(ax)=(ax)+0020h+cf

編寫一個子程序,對兩個128位數據進行相加。
名稱: add128
功能:兩個128位數據進行相加。
參數:
*參數1:*ds:si指向存儲第一個數的內存空間,因數據為128位,所以需要8個字單元,由低地址單元到高地址單元一次存放128位數據由低到高的各個字。運算結果存儲在第一個數的存儲空間中。
*參數2:*ds:di指向存儲的第二個數的內存空間。

程序如下:

add128:push axpush cxpush sipush disub ax,ax ;將cf置0mov cx,8 s:mov ax,[si]adc ax,[di]mov [si],axadd si,2add di,2loop spop dipop sipop cxpop axret

11.7 sbb指令

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

指令格式:sbb 操作對象1,操作對象2
功能:操作對象1 = 操作對象1-操作對象2-CF

與adc具有相同的思想設計


11.8 cmp指令

cmp是比較指令,cmp的功能相當于減法指令,只是不保存結果。cmp指令執行后,將對標志寄存器產生影響

cmp指令格式:cmp 操作對象1,操作對象2
功能:計算操作對象1-操作對象2但并不保存結果,僅僅根據計算結果對標志寄存器進行設置

比如:cmp ax,ax指令執行后:zf=1,pf=1,sf=0,cf=0,of=0。

執行cmp ax,bx后:

  • 如果(ax)=(bx) 則(ax)-(bx)=0,所以:zf=1
  • 如果(ax)!=(bx) 則(ax)-(bx)!=0,所以:zf=0
  • 如果(ax)<(bx) 則(ax)-(bx)將產生借位,所以:cf=1
  • 如果(ax)>=(bx) 則(ax)-(bx)不必借位,所以:cf=0
  • 如果(ax)>(bx) 則(ax)-(bx)即不必借位,結果又不為0,所以:cf=0并且zf=0
  • 如果(ax)<=(bx) 則(ax)-(bx)既可能借位,結果可能為0,所以:cf=1或zf=1
  • 顯然,除了上面那樣還不夠!

    還需要sf和of一起作用(記住,of=1溢出導致實際結果與邏輯結果相反):


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

    “轉移”指的是它能夠修改IP,而“條件”指的是它可以根據某種條件,決定是否修改IP

    指令含義檢測的相關標志位
    je等于則轉移zf=1
    jne不等于則轉移zf=0
    jb低于則轉移cf=1
    jnb不低于則轉移cf=0
    ja高于則轉移cf=0且zf=0
    jna不高于則轉移cf=1或zf=1

    e:表示equal
    ne:表示not equal
    b:表示below
    nb:表示not below
    a:表示above
    na:表示not above

    檢測點 11.3
    (1)補全下面的程序,統計F000:0處32個字節中,大小在[32,128]的數據的個數。

    assume cs:codecode segmentstart:mov ax,0f000hmov ds,axmov bx,0mov dx,0mov cx,32s: mov al,[bx]cmp al,32;低于32jb s0cmp al,128;高于128ja s0;如果在范圍內,則+1inc dxs0:;如果不在范圍內,則+1inc bxloop s code ends end start

    (2)補全下面的程序,統計F000:0處32個字節中,大小在(32,128)的數據個數。

    assume cs:codecode segmentstart:mov ax,0f000hmov ds,axmov bx,0mov dx,0mov cx,32s: mov al,[bx]cmp al,32;不高于是<=jna s0cmp al,128;不低于是>=jnb s0;如果在范圍內,則+1inc dxs0:;如果不在范圍內,則+1inc bxloop s code ends end start

    11.10 DF標志和串傳送指令

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

    格式:movsb
    功能:執行movsb指令相當于進行下面幾步操作。
    (1)((es)?16+(di))=((ds)?16+(si))((es)?16+(di))=((ds)?16+(si))
    (2)如果df=0則:(si)=(si)+1,(di)=(di)+1(si)=(si)+1,(di)=(di)+1
    (3)如果df=1則:(si)=(si)?1,(di)=(di)?1(si)=(si)?1,(di)=(di)?1

    格式:movsw
    功能:將ds:si指向的內存單元中的字送入es:di中,然后根據標志寄存器df位的值,將si和di遞增2或遞減2。
    (1)如果df=0則:add si,2 and add di,2
    (2)如果df=1則:sub si,2 and sub si,2

    格式:rep movsb
    功能:根據cx來決定循環次數,n次就是復制n個字節的內容

    s: movsbloop s

    同理:擁有格式rep movsw
    功能:根據cx來決定循環次數,n次就是復制n個字的內容

    改變方向的2個指令:
    (1)cld指令:將標志寄存器的df置0
    (2)std指令:將標志寄存器的df置1

    例子:
    編程,用串傳送指令,將data段中的第一個字符復制到它后面的空間中。

    mov ax,data mov ds,ax mov si,0 mov es,ax mov di,16 mov cx,16 cld rep movsb

    11.11 pushf和popf

    pushf的功能是將標志寄存器的值壓入棧中,而popf是從棧中彈出數據,送入標志寄存器中。pushf和popf,為直接訪問標志寄存器提供了一種方法。

    檢測點 11.4
    下面的程序執行后:(ax)=?(ax)=?

    mov ax,0 ;ax=0 push ax ;ax=0,stack=[top>0>bottom] popf ;ax=0,stack=[top>bottom] mov ax,0fff0h ;ax=fff0h add ax,0010h ;ax=0h pushf ;ax=0,stack=[top>1000111B>bottom] pop ax ;ax=47h(0100 0111B),stack=[top>bottom] and al,11000101B;ax=45h(0100 0101B) and ah,00001000B;ax=45h

    11.12 標志寄存器在Debug中的表示

    在Debug中,標志寄存器是按照有意義的各個標志位單獨表示的。在Debug中,我們可以看到下面的信息。

    實驗11 編寫子程序


    應用舉例:

    assume cs:codesgdatasg segmentdb "Beginner's All-purpose Symbolic Instruction Code.",0 datasg endscodesg segmentbegin:mov ax,datasgmov ds,axmov si,0call lettercmov ax,4c00hint 21hletterc:;比較是'a'<=ds:[si]<='z';如果是,則變為大寫;否則,啥也不干;循環到0位置push axchange:mov al,ds:[si];ax<'a'則什么也不做cmp al,97jb next;ax>'z'則什么也不做cmp al,122ja next;ax=0,則返回cmp al,0je returnand al,11011111Bmov ds:[si],alnext:inc siloop changereturn:pop axretcodesg ends end begin

    總結

    以上是生活随笔為你收集整理的标记寄存器---汇编学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。