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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 匯編入門學(xué)習(xí)筆記 (九)—— call和ret

          匯編入門學(xué)習(xí)筆記 (九)—— call和ret

          作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          瘋狂的暑假學(xué)習(xí)之 匯編入門學(xué)習(xí)筆記 (九)—— callret

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

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

          call和ret都是轉(zhuǎn)移指令。

          1. ret和retf

          ret指令:用棧中的數(shù)據(jù),修改IP內(nèi)容,從而實(shí)現(xiàn)近轉(zhuǎn)移

          相當(dāng)于:

          pop ip

          retf指令:用棧中的數(shù)據(jù),修改CS和IP,從而實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移

          相當(dāng)于:

          pop ip

          pop cs

          例子:ret

          1. assumecs:code,ss:stack
          2. stacksegment
          3. db16dup(1)
          4. stackends
          5. codesegment
          6. movax,4c00H
          7. int21H
          8. start:movax,stack
          9. movss,ax
          10. movsp,16
          11. movax,0
          12. pushax
          13. ret
          14. codeends
          15. endstart

          retf

          1. assumecs:code,ss:stack
          2. stacksegment
          3. db16dup(1)
          4. stackends
          5. codesegment
          6. movax,4c00H
          7. int21H
          8. start:movax,stack
          9. movss,ax
          10. movsp,16
          11. movax,0
          12. pushcs
          13. pushax
          14. retf
          15. codeends
          16. endstart


          2. call指令

          call指令,執(zhí)行操作:

          1.將當(dāng)前IP或CS和IP壓入棧中

          2.跳轉(zhuǎn)

          (1)依據(jù)位移進(jìn)行轉(zhuǎn)移的call指令

          格式: call 標(biāo)號(hào)

          將下一條的指令的ip壓入棧中,在轉(zhuǎn)到標(biāo)號(hào)處

          相當(dāng)于:

          push ip

          jmp near ptr 標(biāo)號(hào)

          (2)轉(zhuǎn)移的目的地址在指令中的call指令

          格式:

          call far ptr 標(biāo)號(hào)

          將下一條的指令的CS和IP壓入棧中,在轉(zhuǎn)到標(biāo)號(hào)處

          相當(dāng)于:

          push cs

          push ip

          jmp far ptr

          (3)轉(zhuǎn)移地址地址在寄存器中的call指令

          格式:call 16位reg

          相當(dāng)于:

          push ip

          jmp 16位reg

          (4)轉(zhuǎn)移地址在內(nèi)存中的call指令

          1. call word ptr 內(nèi)存單元

          相當(dāng)于:

          push ip

          jmp word ptr 內(nèi)存單元

          2. call dword ptr 內(nèi)存單元

          相當(dāng)于:

          push cs

          push ip

          jmp dword ptr 內(nèi)存單元

          3. mul 指令

          mul 是乘法指令

          表示兩個(gè)數(shù)相乘,它必須是都是8位或者都是16位

          8位相乘 結(jié)果默認(rèn)存放在ax中

          16位相乘 結(jié)果高位存放在dx中,低位存放在ax中

          例子見下面。

          3. call和ret配合使用

          call于ret結(jié)合使用,就相當(dāng)于函數(shù)。

          例子:求dw中數(shù)值的3次方。把bx當(dāng)做“函數(shù)”參數(shù),ax當(dāng)做“函數(shù)”的返回值。

          1. assumecs:code,ds:data
          2. datasegment
          3. dw1,2,3,4,5,6,7,8
          4. dd0,0,0,0,0,0,0,0
          5. dataends
          6. codesegment
          7. start:movax,data
          8. movds,ax
          9. movsi,0
          10. movdi,16
          11. movcx,8
          12. s:movbx,ds:[si]
          13. callcube
          14. movds:[di],ax
          15. movds:[di+2],dx
          16. addsi,2
          17. adddi,4
          18. loops
          19. movax,4c00H
          20. int21H
          21. cube:movax,bx
          22. mulbx
          23. mulbx
          24. ret
          25. codeends
          26. endstart

          寄存器數(shù)量有限,如果要傳的參數(shù),或者返回的參數(shù)過多。可以使用內(nèi)存,或者棧。

          例子:小寫轉(zhuǎn)大寫。(用內(nèi)存存放參數(shù))

          1. assumecs:code,ds:data
          2. datasegment
          3. dbconversation
          4. dataends
          5. codesegment
          6. start:movax,data
          7. movds,ax
          8. movsi,0
          9. movcx,12
          10. callcaptial
          11. movax,4c00H
          12. int21H
          13. captial:andbyteptrds:[si],11011111b
          14. incsi
          15. loopcaptial
          16. codeends
          17. endstart

          例子:計(jì)算 (a - b) ^3 假設(shè)a=3,b=1 (用棧來存放參數(shù))

          1. assumecs:code
          2. codesegment
          3. start:movax,1
          4. pushax
          5. movax,3
          6. pushax
          7. calldifcube
          8. movax,4c00H
          9. int21H
          10. difcube:pushbp
          11. movbp,sp
          12. movax,[bp+4]
          13. subax,[bp+6]
          14. movbp,ax
          15. mulbp
          16. mulbp
          17. popbp
          18. ret4
          19. codeends
          20. endstart

          上面代碼中的 ret 4 表示:

          pop ip

          add sp,n

          例子:小寫轉(zhuǎn)大寫,用0結(jié)尾來判斷。(用棧來處理寄存器沖突)

          1. assumecs:code,ds:data
          2. datasegment
          3. dbword,0
          4. dbcity,0
          5. dbgood,0
          6. dataends
          7. codesegment
          8. start:movax,data
          9. movds,ax
          10. movcx,3
          11. movbx,0
          12. s:pushcx
          13. movsi,bx
          14. callcapital
          15. addbx,5
          16. popcx
          17. loops
          18. movax,4c00H
          19. int21H
          20. capital:movcl,[si]
          21. movch,0
          22. jcxzok
          23. andbyteptr[si],11011111b
          24. incsi
          25. jmpshortcapital
          26. ok:ret
          27. codeends
          28. endstart

          注意:要用棧保存cx

          例子:實(shí)現(xiàn)show_str “函數(shù)” 在屏幕顯示字符串。用dh指定函數(shù) ,dl指定列號(hào),cl指定顏色

          1. assumecs:code,ds:data,ss:stack
          2. datasegment
          3. dbWelcometomasm!,0
          4. dataends
          5. stacksegment
          6. dw8dup(0)
          7. stackends
          8. codesegment
          9. start:movax,data
          10. movds,ax
          11. movax,stack
          12. movss,ax
          13. movsp,16
          14. movdh,10;行
          15. movdl,17;列
          16. movcl,2;顏色
          17. movsi,0
          18. callshow_str
          19. movax,4c00h
          20. int21h
          21. show_str:pushax
          22. pushdi
          23. pushdx
          24. movax,10;確定行段es
          25. muldh
          26. addax,0b800h
          27. moves,ax
          28. movdh,0;確定列偏移di,注意,一個(gè)字符兩個(gè)字節(jié)
          29. adddx,dx
          30. movdi,dx
          31. s:pushcx;保存cx
          32. movch,0
          33. movcl,ds:[si]
          34. jcxzok;如果為0跳轉(zhuǎn)
          35. moves:[di],cl
          36. popcx
          37. moves:[di+1],cl
          38. incsi
          39. adddi,2
          40. jmpshorts
          41. ok:popcx;不要忘記pop,眼不讓rec還原的ip就不對(duì)了
          42. popdx
          43. popdi
          44. popax
          45. ret
          46. codeends
          47. endstart



          關(guān)鍵詞: 匯編入門callre

          評(píng)論


          技術(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); })();