新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 匯編入門學(xué)習(xí)筆記 (六)—— si、di,雙重循環(huán)

        匯編入門學(xué)習(xí)筆記 (六)—— si、di,雙重循環(huán)

        作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
        瘋狂的暑假學(xué)習(xí)之 匯編入門學(xué)習(xí)筆記 (六)—— sidi雙重循環(huán)

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

        參考: 《匯編語(yǔ)言》 王爽 第7章

        1. and和or指令,與[bx+idata]

        and和or,就不多說(shuō)了。

        [bx+idata] 這樣寫是可以的,某些情況下,比較方便。

        [bx+idata] 也可以寫成 idata[bx]

        直接見例子: 把’ABcde‘ 跟 ‘fGHig’ 都改成大寫(ASCII中大寫字母與小寫字母二進(jìn)制中,只有第五位不同,大寫字母是0,小寫字母是1)

        1. assumecs:code,ds:data
        2. datasegment
        3. dbABcde
        4. dbfGHIg
        5. dataends
        6. codesegment
        7. start:movax,data
        8. movds,ax
        9. movbx,0
        10. movcx,4
        11. moval,00100000b
        12. s:or[bx],al
        13. or[5+bx],al;[5+bx]也可以寫成5[bx]
        14. incbx
        15. loops
        16. movax,4c00H
        17. int21H
        18. codeends
        19. endstart

        2. si,di,與[bx+si],[bx+di],[bx+si+idata],[bx+di+idata]

        si與di,除了不能像bx一樣分成bh,bl,其他與bx一樣。如 mov ax,[si] 等等

        [bx+si],[bx+di],[bx+si+idata],[bx+idata]

        這些都是可以的,某些情況下,比較方便。

        其中[bx+si]與[bx+di] 可以寫成 [bx][si],[bx][di]

        [bx+si+idata],[bx+di+idata]可以寫成idata[bx][si],idata[bx][di]

        例子:復(fù)制Welcome!

        1. assumecs:code,ds:data
        2. datasegment
        3. dbWelcome!
        4. dataends
        5. codesegment
        6. start:movax,data
        7. movds,ax
        8. movsi,0
        9. movcx,4
        10. s:movax,[si]
        11. mov8[si],ax
        12. addsi,2
        13. loops
        14. movax,4c00H
        15. int21H
        16. codeends
        17. endstart

        例子:將data中的單詞的首字母改成大寫

        1. assumecs:code,ds:data
        2. datasegment
        3. db1.file
        4. db2.edit
        5. db3.search
        6. db4.view
        7. dataends
        8. codesegment
        9. start:movax,data
        10. movds,ax
        11. movbx,0
        12. movcx,4
        13. moval,11011111b
        14. s:and[bx+2],al
        15. addbx,8
        16. loops
        17. movax,4c00H
        18. int21H
        19. codeends
        20. endstart



        3. 雙重循環(huán)

        例子:data中單詞改成大寫的

        1. assumecs:code,ds:data
        2. datasegment
        3. dbibm
        4. dbdec
        5. dbdos
        6. dbvax
        7. dataends
        8. codesegment
        9. start:movax,data
        10. movds,ax
        11. movbx,0
        12. moval,11011111b
        13. movcx,4
        14. s:movcx,3
        15. movsi,0
        16. s0:and[bx+si],al
        17. incsi
        18. loops0
        19. addbx,8
        20. loops
        21. movax,4c00H
        22. int21H
        23. codeends
        24. endstart

        上面 的代碼,是錯(cuò)誤的會(huì)出現(xiàn)是死循環(huán)。因?yàn)閏x不斷的被賦予3,導(dǎo)致外層循環(huán)死循環(huán)。

        1. assumecs:code,ds:data
        2. datasegment
        3. dbibm
        4. dbdec
        5. dbdos
        6. dbvax
        7. dataends
        8. codesegment
        9. start:movax,data
        10. movds,ax
        11. movbx,0
        12. moval,11011111b
        13. movcx,4
        14. s:movdx,cx;dx用來(lái)臨時(shí)存放外層的cx的值
        15. movcx,3
        16. movsi,0
        17. s0:and[bx+si],al
        18. incsi
        19. loops0
        20. movcx,dx;用來(lái)回復(fù)外層循環(huán)的cx
        21. addbx,8
        22. loops
        23. movax,4c00H
        24. int21H
        25. codeends
        26. endstart

        上面的代碼,雖然能解決上面問(wèn)題,能正常運(yùn)行。但是寄存器的數(shù)量有限,有時(shí),可能沒(méi)有其他的寄存器可以用。

        解決方法,保存在內(nèi)存中。例子:

        1. assumecs:code,ds:data
        2. datasegment
        3. dbibm
        4. dbdec
        5. dbdos
        6. dbvax
        7. dw0;定義一個(gè)字,用來(lái)保存cx
        8. dataends
        9. codesegment
        10. start:movax,data
        11. movds,ax
        12. movbx,0
        13. moval,11011111b
        14. movcx,4
        15. s:movds:[20H],cx
        16. movcx,3
        17. movsi,0
        18. s0:and[bx+si],al
        19. incsi
        20. loops0
        21. movcx,ds:[20H]
        22. addbx,8
        23. loops
        24. movax,4c00H
        25. int21H
        26. codeends
        27. endstart

        上面的代碼,解決了寄存器不夠的情況。但是,還是比較復(fù)雜,如果有很多循環(huán),就會(huì)弄不清楚。

        解決方法,使用棧來(lái)保存恢復(fù)cx。例子1:

        1. assumecs:code,ds:data,ss:stack
        2. datasegment
        3. dbibm
        4. dbdec
        5. dbdos
        6. dbvax
        7. dataends
        8. stacksegment
        9. dw0,0,0,0,0,0,0,0
        10. stackends
        11. codesegment
        12. start:movax,data
        13. movds,ax
        14. movax,stack
        15. movss,ax
        16. movsp,16
        17. movbx,0
        18. moval,11011111b
        19. movcx,4
        20. s:pushcx
        21. movcx,3
        22. movsi,0
        23. s0:and[bx+si],al
        24. incsi
        25. loops0
        26. popcx
        27. addbx,8
        28. loops
        29. movax,4c00H
        30. int21H
        31. codeends
        32. endstart

        例子2:把data中的單詞,前3個(gè)字母改成大寫

        1. assumecs:code,ds:data,ss:stack
        2. datasegment
        3. db1.display.......
        4. db2.brows.........
        5. db3.replace.......
        6. db4.modify........
        7. dataends
        8. stacksegment
        9. dw0,0,0,0,0,0,0,0
        10. stackends
        11. codesegment
        12. start:movax,data
        13. movds,ax
        14. movax,stack
        15. movss,ax
        16. movsp,16
        17. movbx,0
        18. moval,11011111b
        19. movcx,4
        20. s:pushcx
        21. movsi,0
        22. movcx,3
        23. s0:and[bx+si+2],al
        24. incsi
        25. loops0
        26. popcx
        27. addbx,10H
        28. loops
        29. movax,4c00H
        30. int21H
        31. codeends
        32. endstart



        關(guān)鍵詞: 匯編入門sidi雙重循

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 高阳县| 汾西县| 铁岭县| 潜江市| 高台县| 上蔡县| 大庆市| 怀化市| 大埔县| 灵山县| 云龙县| 渭南市| 蓬溪县| 洪雅县| 平阴县| 云梦县| 清流县| 德化县| 靖远县| 澄迈县| 嘉善县| 太原市| 汉川市| 绥滨县| 景泰县| 安岳县| 吉木萨尔县| 股票| 吉隆县| 民权县| 蒙自县| 淳安县| 彭山县| 策勒县| 积石山| 秦皇岛市| 连云港市| 郯城县| 南阳市| 治县。| 林州市|