新聞中心

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

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

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

本文引用地址:http://butianyuan.cn/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)閉