新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 匯編入門學習筆記 (七)—— dp,div,dup

        匯編入門學習筆記 (七)—— dp,div,dup

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

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

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

        1. bx、si、di、和 bp

        8086CPU只有4個寄存器可以用 “[...]” 中進行單元尋址。

        bp:除了默認的段地址是ss,其他與bx一樣。

        它們所有正確的組合

        1. movax,[bx]
        2. movax,[si]
        3. movax,[di]
        4. movax,[dp]
        5. movax,[bx+si]
        6. movax,[bx+di]
        7. movax,[bp+si]
        8. movax,[bp+di]
        9. movax,[bx+si+idata]
        10. movax,[bx+di+idata]
        11. movax,[bp+si+idata]
        12. movax,[bp+di+idata]

        注意:bx與bp不可以同時使用,如[bx+bp]是錯誤的。

        2. 指明要處理的數據長度

        word ptr 表示字

        byte ptr 表示字節

        像這樣,寄存器就直接指定了數據的長度:

        1. movax,1
        2. movax,ds:[0]

        但是,看下面的例子:

        1. assumecs:code,ds:data
        2. datasegment
        3. dw1111H,1111H,1111H,1111H,1111H,1111H,1111H,1111H
        4. dataends
        5. codesegment
        6. start:movax,data
        7. movds,ax
        8. movds:[0],1;Error
        9. movax,4c00H
        10. int21H
        11. codeends
        12. endstart

        這樣編譯會報錯,因為編譯器不知道1是8位還是16位。

        改進:

        1. assumecs:code,ds:data
        2. datasegment
        3. dw1111H,1111H,1111H,1111H,1111H,1111H,1111H,1111H
        4. dataends
        5. codesegment
        6. start:movax,data
        7. movds,ax
        8. movbyteptrds:[0],1;Error
        9. movax,4c00H
        10. int21H
        11. codeends
        12. endstart

        加上byte ptr 或者 word ptr才對。

        加上byte ptr時,運行后,ds段中的值為:0B56:0000 01 11 11 11 11 11 11 11-11 11 11 11 11 11 11 11

        加上word ptr時,運行后,ds段中的值為:0B56:0000 01 00 11 11 11 11 11 11-11 11 11 11 11 11 11 11

        例子:

        1. assumecs:code,ds:data
        2. datasegment
        3. dw00FFH
        4. dataends
        5. codesegment
        6. start:movax,data
        7. movds,ax
        8. incbyteptrds:[0]
        9. movax,4c00H
        10. int21H
        11. codeends
        12. endstart

        inc byte ptr ds:[0] 后,ds:[0] ds:[1] 為 00 00

        如果改為inc word ptr ds:[0],運行后 ds:[0] ds:[1] 位 00 01

        3. 偽指令dd,div指令

        偽指令dd 表示32位,dw表示16位,db表示8位。例子見下面。

        div 是除法指令,格式:div 除數

        除數有兩種,如果是8位的,被除數就是16位的,且存放在ax中。運算結果:商存放在 al 中,余數存放在 ah 中

        如果除數是16位的,被除數就是32位的,且低16位放在 ax 中,高16位就存放在 dx 中。運算結果:商存放在 ax 中,余數存放在 dx 中

        被除數就是32位的例子:

        1. assumecs:code,ds:data
        2. datasegment
        3. dd100001
        4. dw100
        5. dw0
        6. dataends
        7. codesegment
        8. start:movax,data
        9. movds,ax
        10. movax,ds:[0]
        11. movdx,ds:[2]
        12. divwordptrds:[4]
        13. movds:[6],ax
        14. movax,4c00H
        15. int21H
        16. codeends
        17. endstart

        運行后ax為03E8H ,dx 為0001H

        4. dup

        dup 要與dd,dw,db配合使用,用來重復定義數據

        例子:

        db 3 dup (0)

        定義了3個字節,它們都是0,相當于 db 0,0,0

        db 3 dup (0,1,2)

        定義了9個字節,它們是0、1、2、0、1、2、0、1、2

        相當于 db 0,1,2,0,1,2,0,1,2

        db 3 dup(abc,ABC)

        定義了18個字符,它們是 ‘abcABCabcABCabcABC’

        相當于 db‘abcABCabcABCabcABC’



        關鍵詞: 匯編入門dpdivdu

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 上蔡县| 错那县| 无棣县| 静海县| 胶州市| 邯郸市| 新源县| 宾川县| 习水县| 南皮县| 如东县| 湘潭县| 简阳市| 旺苍县| 德钦县| 临洮县| 日喀则市| 微博| 石景山区| 彩票| 亚东县| 重庆市| 方城县| 确山县| 新民市| 西和县| 无棣县| 台湾省| 海丰县| 南宫市| 澄迈县| 固安县| 张家界市| 和硕县| 庆元县| 镇远县| 安顺市| 读书| 武川县| 芦溪县| 贵州省|