<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/317780.htm

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

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

          and和or,就不多說了。

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

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

          直接見例子: 把’ABcde‘ 跟 ‘fGHig’ 都改成大寫(ASCII中大寫字母與小寫字母二進制中,只有第五位不同,大寫字母是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

          上面 的代碼,是錯誤的會出現(xiàn)是死循環(huán)。因為cx不斷的被賦予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用來臨時存放外層的cx的值
          15. movcx,3
          16. movsi,0
          17. s0:and[bx+si],al
          18. incsi
          19. loops0
          20. movcx,dx;用來回復(fù)外層循環(huán)的cx
          21. addbx,8
          22. loops
          23. movax,4c00H
          24. int21H
          25. codeends
          26. endstart

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

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

          1. assumecs:code,ds:data
          2. datasegment
          3. dbibm
          4. dbdec
          5. dbdos
          6. dbvax
          7. dw0;定義一個字,用來保存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),就會弄不清楚。

          解決方法,使用棧來保存恢復(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個字母改成大寫

          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雙重循

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();