第九章 轉移指令

2022-09-19 07:51:11 字數 2615 閱讀 7038

目錄有條件轉移指令(jcxz、jne、je等等)

迴圈指令(loop)

注意點課後檢測點

轉移指令可以理解為轉移程式執行位置的指令。轉移指令通常會修改ip或(ipcs)。

其使用方式根據跳轉的距離(修改ip的範圍)分為三種

段內短轉移——跳轉的ip範圍為-128~127

段內近轉移——跳轉的ip範圍為-32768~32767

段間轉移——沒有限制

其中帶有內的內容其實可以忽略,因為這個大多數是用於編譯器檢查的;如果不加支援兩種範圍的段內轉移

大家可以試試這段**驗證一下猜想

assume cs:codesg

codesg segment

mov ax, 32767

; 使用下面這行**就會報錯

; jmp short temp

; 使用下面這行**就不會報錯,但是會有個警告,說接近64k(即65536)

jmp temp

db 65535 dup (0)

temp:

mov ax,4c00h

int 21h

codesg ends

end

第二種指令僅支援16位reg,大家也不用考慮8位reg~~~;第二種指令其實和第一種的原理是一樣的,後續講解原理的時候會講到。

第三種指令對於段內轉移來說就是換一種方式取資料;而對於段間轉移的話,高位位址儲存cs數值;低位位址儲存ip的數值

注意jmp指令,在彙編**裡是jmp 0004,而在二進位制裡是eb02,為什麼這裡是02,而不是04呢?

對於段內轉移來說,jmp指令是根據偏移量來定位的,比如上述的例子:jmp指令後的第一條指令與標號之間的偏移量,也就是——(076a:0004-076a:0002=02

注意此處加入了一行db 128 dup (0)指令,主要是讓標號temp超出段內短轉移的範圍(否則即使使用jmp far ptr 標號,編譯器也會進行優化。)

這裡的表示方法就比較簡單粗暴,易於看懂,這裡就不多加解釋了。

有條件轉移指令包含了以下幾個:

jcxz:當cx==0時,跳轉到指定標號處

jne:當zf==0時(兩個數不相等時),跳轉到指定標號處

je:當zf==1時(兩個數相等時),跳轉到指定標號處

jb:當cf==1時(第乙個數小於第二個數),跳轉到指定標號處

jnb:當cf==0時(第乙個數不小於第二個數),跳轉到指定標號處

ja:當cf0&&zf0(第乙個數大於第二個數),跳轉到標號處

jna:當cf0||zf1(第乙個數不大於第二個數),跳轉到標號處

這裡著重分析第一條jcxz指令,該指令是當cx==0時,跳轉到標號處的指令,該指令的運算元範圍為-128~127,可以理解為帶有條件的jmp short 標號,運算元範圍為-128~127

loop指令主要執行以下操作:

--cx

if(cx != 0) 跳轉到標號處執行

if(cx == 0) 繼續向下執行

該指令是短轉移(所有的迴圈指令都是短轉移),在對應的機器碼中包含轉移的位移而不是目的位址,運算元範圍為-128~127

如果對 偏移在-128~127之間的標號使用 偏移距離大於127的轉移指令(段內近轉移或者段間轉移),就會生成nop(可以理解為對齊吧),看下面的示意圖

這裡純屬個人猜測:由於jmp near ptr 標號的範圍是-32768~32767(ffff),所以編譯器對於範圍在-128~127內的偏移量會自動進行轉換,比如段內近轉移一般要3個位元組,段內短轉移只需要2個位元組,所以使用段內近轉移表示段內短轉移的偏移量,會多生成乙個位元組湊夠3個位元組

第九章檢測點

第九章 轉移指令的原理

一 操作符offset 格式 offset 標號 二 jmp指令 jmp為無條件轉移指令,可以只修改ip,也可以同時修改cs和ip。三 依據位移進行轉移的jmp指令 1 jmp short 標號 實現段內短轉移 功能 ip ip 8位位移 8位位移 標號處位址 jmp指令後的第乙個位元組的位址 sh...

組合語言 第九章 轉移指令

修改cs ip的值 範圍在 128 127之間,也就是說向前轉移最多128位元組,向後127位元組 mov ax,0 b80000 對應機器碼 jum short s eb03 兩位元組 這裡的eb是jum的機器碼,03指的ip是向下移動2位元組,這裡的03我們就稱為轉移位移,一般用補碼表示,有負數...

組合語言 第九章 轉移指令的原理

1 可以修改ip,或同時修改cs和ip的指令統稱為轉移指令.轉移指令就是可以控制cpu執行記憶體中某處的 指令 8086cpu的轉移行為有以下幾類 1 只修改ip時,稱為段內轉移.比如 jmp ax.2 同時修改cp和ip時,稱為段間轉移,比如 jmp 1000 0 由於轉移指令對ip的修改範圍不同...