转移指令的原理
可以修改IP,或同時修改CS和IP對的指令統稱為轉移指令。概括的來講,轉移指令就是可以控制CPU執行內存中的某處代碼的指令
8086CPU的轉移行為有以下=幾類。
- 只修改IP的段內轉移,比如:jmp ax
- 同時修改CS和IP時,稱為段間轉移,比如:jmp 1000:0
由于轉移指令對IP的修改范圍不同,段內的轉移又分為:短轉移和近轉移 - 短轉移的IP修改范圍是-128~127
- 近轉移IP的修改范圍為-32786~32786
8086CPU的轉移指令分為以幾類:
- 無條件轉移指令(如:jmp)
- 條件轉移指令
- 循環指令(如:loop)
- 過程
- 中斷
操作符offset
操作符offset在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址;
assume cs:code code segmentstart: mov ax,offset start ;相當于 mov ax,0s: mov ax,offset s ;相當于 mov ax,3 code ends end startmov ax,offset start相當于指令mov ax,0,因為start是代碼段中標號,它所標記的指令是代碼中的第一條指令,偏移地址為0;
mov ax,offset s 相當于指令mov ax,3,因為s是代碼中的標號,它所指向的指令是代碼中第二條指令,第一條指令的長度是3個字節,則s的偏移地址為3;
jmp指令
依據位移進行轉移的jmp指令
jmp short 標號(跳轉到標號處執行)
這種jmp實現的是段內轉移,它對IP修改的范是-128~127。jmp指令前的short說明要進行的是短轉移,
例如:
還有一種和jmp功能想近的指令格式,jmp near ptr標號,它實的是段內近轉移
轉移的目的地址在指令中的jmp指令
指令“jmp far ptr 標號”實現的是段間轉移,又稱為遠轉移
實現代碼如下:
轉移指令在寄存器中的jmp指令
指令格式:jmp 16位寄存器
轉移地址在內存中的jmp指令
格式:
jmp word ptr 內存單元地址(段內轉移)
功能:從內存單元地址處開始存放著一個字,是轉移的目的偏移地址。
內存單元地址可用尋址方式的任一格式給出。jmp dword ptr 內存單元地址(段間轉移)
功能:從內存單元地址處開始存放著兩個字,高地址處的字是轉移的目的段地址,低地址處是轉移的偏移地址;
(CS) = (內存單元地址 + 2)
(IP) = (內存單元地址)
jcxz指令
jcxz指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移位移,而不是目的的地址。對IP的修改范圍為:-128~127。
指令格式:jcxz 標號(如果(CX) = 0,轉移到標號處執行)
操作: 當(cx)==0時,(IP)=(IP)+8位位移
也是判斷 CX 是否為零作為跳轉的條件
當(cx)!=0時,什么也不做(程序向下執行);
<==>
if((cx)==0)jmp short 標號;
loop指令
loop指令為循環指令,所有的循環指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍為:-128~127.
指令格式: loop 標號((cx)!= 0,轉移到標號處執行。)
<==>
高級語言
根據位移進行轉移的意義
方便程序進行浮動裝配
mov cx,6 mov ax,10H s:add ax,ax loop s這一段代碼放在程序的任何地方都能正常的執行
編譯器對轉移位移超界的檢測
注意,根據位移進行轉移的指令,他們的轉移范圍受到轉移移位的限制,如果在源程序中出現了轉移范圍超界限的問題,在編譯的時候編譯器將會報錯
總結
- 上一篇: 作者:曾春秋,男,美国佛罗里达国际大学计
- 下一篇: 作者:Anjaneyulu Passal