新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 匯編入門學習筆記 (十)—— 標志寄存器、串傳送指令

        匯編入門學習筆記 (十)—— 標志寄存器、串傳送指令

        作者: 時間:2016-11-09 來源:網絡 收藏
        瘋狂的暑假學習之 匯編入門學習筆記 (十)—— 標志寄存器

        本文引用地址:http://www.104case.com/article/201611/317784.htm

        參考: 《匯編語言》 王爽 第11章

        CPU內部有一種特殊的寄存器叫標志寄存器(flag),它與ax,bx,cx等其他寄存器不同,它不是用來存放數據的,而是用來存放狀態的。flag寄存器是按位器作用的,即只有0和1。

        flag寄存器的結構:

        15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

        OF DF IF SF ZF AF PF CF

        在debug中標志位的表示:

        標志 1 0

        of OV NV

        sf NG PL

        zf ZR NZ

        pf PE PO

        cf CY NC

        df DN UP

        1. ZF標志

        零標志位。如果上條相關指令結果為0,那門ZF=1,不為0那門ZF=0

        例子:

        1. movax,1
        2. subax,1

        1. movax,1
        2. andax,0

        執行后zf為1

        add,sub,mul,div,inc,or,and等這些運算指令會影響標志寄存器

        mov,push,pop等轉移指令對標志寄存器沒有影響

        2. PF 標志

        奇偶標志位。是0是1的規則 ,類似于奇校驗。

        如果上條相關指令結果二進制中1的個數為偶數,則PF=1,為奇數則PF=0 。

        例子:

        1. moval,1
        2. addal,10

        al = 00001011b

        pf = 0

        1. moval,1
        2. oral,2

        al = 00000011b

        pf = 1


        3. SF標志

        符號標志位。

        如果上條相關指令結果為負數,則SF=1,正數則SF=0

        本質就是看第一位是否為1

        1. moval,10000001b
        2. addal,1

        SF = 1

        4. CF標志

        表示無符號計算中的進位(注意:inc和dec指令是不影響CF的,但會影響ZF與OF)

        例子:

        1. moval,98H
        2. addal,al

        CF = 1

        相減為負數,也會使得CF = 1

        1. movax,1
        2. subax,2

        5. OF標志

        表示有符號計算的溢出(注意:inc和dec指令是會影響OF的)

        例如8位補碼 表示的數的范圍 -128~127

        例子:

        1. moval,0F0H
        2. addal,88H

        -16+(-120) = -136

        超過了范圍,所以OF = 1

        6. abc 指令

        帶進位的加法指令

        abc ax,bx

        相當于(ax)=(ax)+(bx)+CF

        例子:實現兩個128位數據相加

        1. assumecs:code,ds:data
        2. datasegment
        3. db88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h
        4. db11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h
        5. dataends
        6. codesegment
        7. start:movax,data
        8. movds,ax
        9. movsi,0
        10. movdi,16
        11. movcx,8
        12. calladd128
        13. add128:pushax
        14. pushcx
        15. pushsi
        16. pushdi
        17. subax,ax;將CF設置為0
        18. s:movax,[si]
        19. adcax,[di]
        20. mov[si],ax
        21. incsi;不用add是因為add會改變CF的值
        22. incsi
        23. incdi
        24. incdi
        25. loops
        26. popdi
        27. popsi
        28. popcx
        29. popax
        30. codeends
        31. endstart


        7. sbb指令

        sbb是帶借位的減法指令

        sbb ax,bx 相當于(ax)=(ax)-(bx)-CF

        8. cmp指令

        cmp是比較指令,相當于減法,但不保存結果只改變flag

        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)不會產生錯位,結果也不可能為0, 所以:cf = 0 并且zf = 0;

        可以這么說:

        zf = 1 說明(ax)=(bx)

        zf = 0 說明(ax)!=(bx)

        cf = 1 說明(ax)< (bx)

        cf = 0 說明 (ax)>= (bx)

        cf = 0 并且zf = 0 ,說明(ax)>(bx)

        cf = 1 或者zf=1, 說明 (ax)<=(bx)

        對于有符號數來說

        zf = 1 說明(ax)=(bx)

        zf = 0 說明(ax)!=(bx)

        sf=1 并且 of=0,說明(ax)<(bx)

        sf=0 并且 of=1,說明(ax)<(bx)

        sf=1 并且 of=1,說明(ax)>(bx)

        sf=0 并且 of=0,說明(ax)>=(bx)

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

        對于無符號數:

        je 等于則轉移 zf=1

        jne 不等于則轉移 zf=0

        jb 低于則轉移 cf=1

        jnb 不低于則轉移 cf=0

        ja 高于則轉移 cf=0且cf = 0

        jna 不高于則轉移 cf=1或zf=1

        各個字母的意思:

        j:jmp

        e:equal

        ne:not equal

        b:below

        nb:not below

        a:above

        na:not above

        例如實現:如果(ah)=(bh)則(ah)=(ah)+(ah),否則(ah)=(ah)+(bh)

        1. cmpah,bh
        2. jes
        3. addah,bh
        4. ddah,ah

        例子:計算data段中為8的數的個數,記錄在ax中

        1. assumecs:code,ds:data
        2. datasegment
        3. db8,11,23,8,2,3,8,8
        4. dataends
        5. codesegment
        6. start:movax,data
        7. movds,ax
        8. movsi,0
        9. movax,0
        10. movcx,8
        11. s:cmpbyteptrds:[si],8
        12. jnenext
        13. incax
        14. next:incsi
        15. loops
        16. movax,4c00H
        17. int21H
        18. codeends
        19. endstart


        10. DF 標志位和串傳送指令

        df=0 每次操作后si、di遞增;

        df=1 每次操作后si、di遞減;

        movsb

        功能:將ds:si 指向的內存單元中的字節送入es:di中,然后根據標志寄存器df位的值,將si和di遞增或遞減1

        相當于:

        (1)((es)*16+(di))=((ds)*16+(si))

        (2)df=0則:(si)=(si)+1

        (di)=(di)+1

        df=1則:(si)=(si)-1

        (di)=(di)-1

        movsw

        功能:于movsb相同,只是是傳送一個字,然后就是si和di是遞增或遞減2

        指令cld,std

        cld:將df設置為0

        std:將df設置為1

        rep指令

        功能:根據cx的值重復執行,后面的串指令。

        格式:rep movsb

        例子:復制data中的Welcome to masm!

        1. assumecs:code,ds:data
        2. datasegment
        3. dbWelcometomasm!
        4. db16dup(0)
        5. dataends
        6. codesegment
        7. start:movax,data
        8. movds,ax
        9. moves,ax
        10. movdi,16
        11. movsi,0
        12. movcx,16
        13. cld
        14. repmovsb
        15. movax,4c00h
        16. int21h
        17. codeends
        18. endstart

        11. pushf和popf

        pushf的功能是將標志寄存器的值壓棧,而popf是從棧中彈出數據,送入標志寄存器中



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 英德市| 巩留县| 淮北市| 图木舒克市| 韶关市| 高阳县| 宁阳县| 米易县| 定边县| 宁强县| 毕节市| 昌江| 静乐县| 正镶白旗| 富阳市| 化德县| 湟源县| 泾源县| 巴塘县| 达孜县| 嘉鱼县| 辽宁省| 永登县| 金乡县| 朝阳县| 阳春市| 根河市| 双柏县| 友谊县| 韶关市| 渭南市| 康保县| 商河县| 连平县| 舟曲县| 西城区| 桦川县| 宁化县| 齐河县| 禹城市| 浦东新区|