目錄有條件轉移指令(jcxz、jne、je等等)
迴圈指令(loop)
注意點課後檢測點
轉移指令可以理解為轉移程式執行位置的指令。轉移指令通常會修改ip
或(ip
與cs
)。
其使用方式根據跳轉的距離(修改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的修改範圍不同...