匯編語言--轉移指令的原理
轉移指令的原理
可以修改IP,或同時修改CS和IP的指令統稱為轉移指令。
概括以講,轉移指令就是可以控制CPU執行內存中某處的代碼的指令。
8086CPU的轉移行為有以下幾類:
l 只修改IP時,稱為段內轉移,比如:jmp ax。
l 同時修改CS和IP時,稱為段間轉移,比如:jmp 1000:0。
由于轉移指令對IP的修改范圍不同,段內轉換又分為:短轉移和近轉移。
l 短轉移IP的修改范圍為-128~127。
l 近轉移IP的修改范圍為-32768~32767。
8086CPU的轉移指令分為以下幾類:
l 無條件轉移指令(如:jmp)
l 條件轉移指令
l 循環指令(如:loop)
l 過程
l 中斷
這些轉移指令轉移的前提條件可能不同,但轉移的基本原理是相同的。
操作符offset
操作符offset在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址。如:
assume cs:codesg
codesg segment
start: mov ax, offset start ;相當于mov ax,0
s:mov ax, offset s ;相當于mov ax,3
codesg ends
end start
jmp指令
jmp為無條件轉移指令,可以只修改IP,也可以同時修改CS和IP。
jmp指令要給出兩種信息:
l 轉移的目的地址
l 轉移的距離(段間轉移、段內短轉移、段人近轉移)
依據位移進行轉移的jmp指令
jmp short 標號(轉到標號處執行指令)
這種格式的jmp指令實現的是段內短轉移,它對IP的修改范圍為-128~127,也就是說,它向前轉移時可以最多越過128個字節,向后轉移可以最多越過127個字節。
jmp指令中的“short”符號,說明指令進行的是短轉移。
jmp指令中的“標號”是代碼段中的標號,指明了指令要轉移的目的地,轉移指令結束后,CS:IP應該指向標號處的指令。
比如:
assume cs:codesg
codesg segment
start: mov ax,0
mov bx,0
jmp short s
add ax,1
s: inc ax
codesg ends
end start
CPU在執行jmp指令的時候并不需要轉移的目的地址。
在“jmp short 標號”指令所對應的機器碼中,并不包含轉移的目的地址,而包含的是轉移的位移,這個位移,是編譯器根據匯編指令中的“標號”計算出來的。
實際上,指令“jmp short 標號”的功能為:(IP)=(IP)+8位位移。
(1)8位位移=“標號”處的地址-jmp指令后的第一個字節的地址;
(2)short指明此處的位移為8位移;
(3)8位位移的范圍為-128~127,用補碼表示;
(4)8位位移由編譯器在編譯時算出。
還有一種和指令“jmp short 標號”功能相近的指令格式:jmp near prt 標號,它實現的是段內近轉移。
指令“jmp near ptr 標號”的功能為:(IP)=(IP)+16位位移。
(1)16位位移=指令“標號”處的地址-jmp指令后的第一個字節的地址;
(2)near ptr指明此處的位移為16位位移,進行的是段內近轉移;
(3)16位位移的范圍為-32768~32767,用補碼表示。
(4)16位位移由編譯器程序在編譯時算出。
轉移的目的地址在指令中的jmp指令
前面講的jmp指令,其對應的機器指令中并沒有轉移的目的地址,而是相對于當前IP的轉移地址。
指令“jmp far ptr 標號”實現的是段間轉移,又稱為遠轉移。功能如下:
(CS)=標號所在段的段地址;(IP)=標號所在段中的偏移地址。
far ptr指明了指令用標號的段地址和偏移地址修改CS和IP。
轉移地址在寄存器中的jmp指令
指令格式:jmp 16位寄存器
功能:(IP)=(16位寄存器)
轉移地址在內存中的jmp指令
有兩種格式:
(1) jmp word ptr 內存單元地址(段內轉移)
功能:從內存單元地址處開始存放著一個字,是轉移的目的偏移地址。
內存單元寺睛可用尋址方式的任一格式給出。比如:
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
執行后,(IP)=0123H。
又如:
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
執行后,(IP)=0123H
(2) jmp dword ptr 內存單元地址(段間轉移)
功能:從內存單元地址處開始存放著兩個字,高地址處的字是轉移的目的段地址,低地址處是轉移的目的偏移地址。
(CS)=(內存單元地址+2)
(IP)=(內存單元地址)
內存單元地址可用尋址方式的任一格式給出。如:
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
執行后,(CS)=0,(IP)=0123H,CS:IP指向0000:0123。
又如,
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
執行后,(CS)=0,(IP)=0123H,CS:IP指向0000:0123。
jcxz指令
jcxz指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍都為:-128~127。
指令格式:jcxz 標號(如果(cx)=0, 轉移到標號處執行。)
操作:當(cx)=0時,(IP)=(IP)+8位位移;
8位位移=“標號”處的地址-jczx指令后的第一個字節的地址;
8位位移的范圍為-128~127,用補碼表示;
8位位移由編譯器在編譯時算出。
當(cx不等于0時),什么也不做(程序向下執行)。
指令“jcxz 標號”的功能相當于:
if (cx)==0 jmp short 標號;
loop指令
loop指令為循環指令,所有的循環指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍都為:-128~127。
指令格式:loop 標號((cx)=(cx)-1,如果(cx)≠0,轉移到標號處執行。)
操作:(1)(cx)=(cx)-1
(2) 如果(cx)≠0,(IP)=(IP)+8位位移。
8位位移=“標號”處的地址-loop指令后的第一個字節的地址;
8位位移的范圍為-128~127,用補碼表示;
8位位移由編譯器在編譯時算出。
如果(cx)=0,什么也不做(程序向下執行)。
指令“loop 標號”的功能相當于:
(cx)--;
if ( (cx)≠0) jmp short 標號;
根據位移進行轉移的意義
jmp short 標號
jmp near ptr 標號
jcxz 標號
loop 標號
它們對IP的修改是根據轉移目的地址和轉移起始地址之間的位移來進行的。
在它們對應的機器碼中不包含轉移的目的地址,而包含的是到目的地址的位移。
這種設計,方便了程序段在內存中的浮動裝配。
編譯器對轉移位移超界的檢測
根據位移進行轉移的指令,它們在轉移范圍受到轉移位移的限制,如果在源程序中出現了轉移范圍超界的問題,在編譯的時候,編譯器將報錯。
posted on 2010-08-04 10:30 luqingfei 閱讀(813) 評論(0) 編輯 收藏 引用 所屬分類: 匯編語言基礎學習