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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 匯編入門學習筆記 (八)—— 轉移指令

          匯編入門學習筆記 (八)—— 轉移指令

          作者: 時間:2016-11-09 來源:網(wǎng)絡 收藏
          瘋狂的暑假學習之 匯編入門學習筆記 (八)—— 轉移指令

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

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

          可以修改ip或者同時修改cs和ip的指令統(tǒng)稱為轉移指令。

          8086CPU轉移行為分為:

          段內轉移:只修改ip

          段間轉移:同時修改cs和ip

          段內轉移按ip修改的范圍可分為:

          短轉移:ip修改范圍 -128~127

          近轉移:ip修改范圍 -32768~32767

          轉移指令分為:

          無條件轉移指令。如 jmp

          條件轉移指令

          循環(huán)指令。如 loop

          過程。

          中斷。

          1. offset,nop指令

          offset 獲取標號的偏移地址

          nop 占用1一個字節(jié)

          例子:

          1. assumecs:code
          2. codesegment
          3. start:movax,bx
          4. movsi,offsetstart
          5. movdi,offsets
          6. movax,cs:[si]
          7. movcs:[di],ax
          8. s:nop
          9. nop
          10. codeends
          11. endstart


          2. 依據(jù)位移進行轉移的jmp指令

          (1)jmp short 標號

          是段內短轉移。

          表示轉移到指定的標號處,且轉移的距離范圍為-128~127

          用debug查看此指令時,會看見機器碼,不會保存標號的地址,自會保存轉移的距離

          (2)jmp near ptr標號

          是段內近轉移,轉移的距離范圍為-32768~32767,其他與jmp short 標號相同

          2. 轉移地址在寄存器中的jmp指令

          jmp 16位 reg

          表示 (IP)=(16位 reg)

          3.轉移地址在內存中的jmp指令

          (1)jmp word ptr 內存單元地址

          是段內近轉移。

          例子:轉移到偏移地址為0123H的指令去,即使(IP)= 0123H

          1. movax,0123H
          2. movds:[0],ax
          3. jmpwordptrds:[0]

          (2)jmp dword ptr 內存單元地址

          是段間轉移

          高地址表示轉移的段地址

          低地址表示偏移地址

          用debug查看機器碼,可以發(fā)現(xiàn),它是保存了段地址與偏移地址,而不是像段內轉移的指令時保存轉移的距離

          例子:轉移到段地址為0,偏移地址為0123H的指令去,即使得(CS)= 0,(IP)= 0123H

          1. movax,0123H
          2. movds:[0],ax
          3. movwordptrds:[2],0
          4. jmpdwordptrds:[0]

          4. jcxz 指令

          jcxz 指令為條件轉移指令。當cx為0時,轉移(與loop剛剛相反)。所有條件轉移指令都是短轉移。

          例子:在內存2000H段中查找第一個值位0 的字節(jié),并把它的偏移指定存儲在dx中。

          1. assumecs:code
          2. codesegment
          3. start:movax,2000H
          4. movds,ax
          5. movbx,0
          6. s:movch,0
          7. movcl,[bx]
          8. jcxzok
          9. incbx
          10. jmpshorts
          11. ok:movdx,bx
          12. movax,4c00H
          13. int21H
          14. codeends
          15. endstart


          5. jmp指令詳細分析

          jmp s

          jmp short s

          jmp near ptr s

          jmp far ptr s

          向前轉移:

          在像前轉移時,編譯器可以在讀到標號s后記下AC(地址計算器)的值as,在讀到jmp ...s (上面5種)后記下AC的值aj。編譯器可以用as-aj計算出disp

          (1)如果disp 在-128~127 內

          上面的每一種指令都將轉化為jmp short s

          (2)如果disp 在-32768~32767內

          對于jmp short s會編譯錯誤

          對于jmp s,jmp near ptr s會產生jmp near ptr s所對應的機器碼。

          對于jmp far ptr s,所對應的機器碼為:EA 偏移地址 段地址。

          先后轉移:

          由于不能確定s位置,編譯器先將上面的指令都當做 jmp short s來讀取。記下jmp ..s 指令的位置和AC的值aj。

          對于jmp short s 編譯器生成一個EB和一個nop指令

          對于jmp near ptr s編譯器生成一個EB和兩個nop指令

          對于jmp far ptr s編譯器生成一個EB和四個nop指令

          當讀到s時,記下AC的值as,計算disp = as - aj

          (1)如果disp 在-128~127 內

          指令都為 EB disp ,它們后面的一個nop變成8位的disp 。jmp s(1個)、jmp near ptr s (1個)跟jmp far ptr s (3個) nop指令不變

          (2)如果disp 在-32768~32767內

          對于jmp short s會編譯錯誤

          jmp s、jmp near ptr s 后面 兩個nop變成轉移的16位disp。

          jmp far ptr s 這填上相應的段地址,偏移地址。

          6. 分析一個奇怪的程序

          1. assumecs:code
          2. codesegment
          3. movax,4c00h
          4. int21h
          5. start:movax,0
          6. s:nop
          7. nop
          8. movdi,offsets
          9. movsi,offsets2
          10. movax,cs:[si]
          11. movcs:[di],ax
          12. s0:jmpshorts
          13. s1:movax,0
          14. int21h
          15. movax,0
          16. s2:jmpshorts1
          17. nop
          18. codeends
          19. endstart

          追后程序會運行s處的

          mov ax,4c00h

          int 21h

          而正常終止。

          為什么?

          debug可以發(fā)現(xiàn),jmp short s1 復制到s處后,由原來的jmp 0018H變成 jmp 0000H。

          但是本質的機器碼是EBF6沒變就是ip = ip - 10。



          關鍵詞: 匯編入門轉移指

          評論


          技術專區(qū)

          關閉
          看屁屁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); })();