<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 匯編入門(mén)學(xué)習筆記 (八)—— 轉移指令

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

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
瘋狂的暑假學(xué)習之 匯編入門(mén)學(xué)習筆記 (八)—— 轉移指令

本文引用地址:http://dyxdggzs.com/article/201611/317782.htm

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

可以修改ip或者同時(shí)修改cs和ip的指令統稱(chēng)為轉移指令。

8086CPU轉移行為分為:

段內轉移:只修改ip

段間轉移:同時(shí)修改cs和ip

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

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

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

轉移指令分為:

無(wú)條件轉移指令。如 jmp

條件轉移指令

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

過(guò)程。

中斷。

1. offset,nop指令

offset 獲取標號的偏移地址

nop 占用1一個(gè)字節

例子:

  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ìn)行轉移的jmp指令

(1)jmp short 標號

是段內短轉移。

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

用debug查看此指令時(shí),會(huì )看見(jiàn)機器碼,不會(huì )保存標號的地址,自會(huì )保存轉移的距離

(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ā)現,它是保存了段地址與偏移地址,而不是像段內轉移的指令時(shí)保存轉移的距離

例子:轉移到段地址為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時(shí),轉移(與loop剛剛相反)。所有條件轉移指令都是短轉移。

例子:在內存2000H段中查找第一個(gè)值位0 的字節,并把它的偏移指定存儲在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

向前轉移:

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

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

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

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

對于jmp short s會(huì )編譯錯誤

對于jmp s,jmp near ptr s會(huì )產(chǎn)生jmp near ptr s所對應的機器碼。

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

先后轉移:

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

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

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

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

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

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

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

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

對于jmp short s會(huì )編譯錯誤

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

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

6. 分析一個(gè)奇怪的程序

  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

追后程序會(huì )運行s處的

mov ax,4c00h

int 21h

而正常終止。

為什么?

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

但是本質(zhì)的機器碼是EBF6沒(méi)變就是ip = ip - 10。



關(guān)鍵詞: 匯編入門(mén)轉移指

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>