轉移指令
# 8086cpu的轉移指令分為以下幾類:
* 無條件轉移指令(如:jmp)
* 條件轉移指令
* 迴圈指令(如:loop)
* 過程(相當於函式)
* 中斷
# 操作符offset在組合語言中是由編譯器處理的符號,它的功能是取得標號的偏移位址
a. 無條件轉移:
# jmp為無條件轉移,可以只改變ip,也可以同時修改cs和ip
jmp指令要提供兩條資訊:
* 轉移的目的位址
* 轉移的距離(段間距離,段內短轉移,段內近轉移)
//******************************段內轉移***********************************=
1)jmp short 標號 (轉到標號處執行指令)
這種格式的jmp指令實現的是段內短轉移,它對ip的修改範圍為-128-127,即向前轉移最多 可以越過128個位元組,向後轉移最多可以越過127個位元組
assume cs:codesg
codesg segment
start: mov ax,0
jmp short s
add ax,1 //此處ax+1未執行,由jmp直接跳過了,所以最終ax為1
s:inc ax
codesg ends
end start
實際上,指令"jmp short 標號"的功能為ip=ip+8位位移
* 8位位移="標號"處的位址->jmp指令後的第乙個位元組的位址
* short指令表明此處的位移為8位位移
* 8位位移的範圍為-128-127,用補碼表示
* 8位位移由編譯程式在編譯時算出
2) jmp near ptr 標號(和jmp short 標號類似,不過是段內近轉移)
指令"jmp near ptr 標號"的功能為ip=ip+16位位移
* 16位位移="標號"處的位址->jmp指令後的第乙個位元組的位址
* near指令表明此處的位移為16位位移
* 16位位移的範圍為-32769-32768,用補碼表示
* 16位位移由編譯程式在編譯時算出
3)jmp 16位暫存器
功能:ip=16位暫存器
4)jmp word ptr 記憶體單元位址
功能:從記憶體單元位址處開始存放乙個字,是轉移的目的的偏移位址
//******************************段間轉移***********************************====
1)jmp far ptr 標號(實現的是段間轉移,又稱為遠轉移)
功能:* cs=標號所在段的段位址
* ip=標號所在段中的偏移位址
2)jmp dword ptr 記憶體單元位址
功能:從記憶體單元位址處開始存放兩個字,高位址處的字是轉移目的的段位址,低位址處是 偏移位址
b.有條件轉移
1)jcxz指令
jcxz指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移
而不是目的位址。對ip的修改範圍都為-128-127
指令格式: jcxz 標號
如果cx=0,則轉移到標號處執行,相當於(if(cx==0) jmp short 標號)
2)loop
loop為迴圈指令,所有的迴圈指令都是短轉移,在對應的機器碼中包含轉移的位移,對ip的修改範圍
為-128-127
指令格式:loop 標號
每次執行後cx=cx-1,如果cx!=0,則轉移到標號處執行,與jcxz相反,相當於
if(--cx!=0)
jmp short 標號
!!!注意使用轉移指令時,比如
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start:
mov ax,0
s:nop //什麼也不做,佔乙個位元組
nopmov di,offset s //di儲存s標誌所在的偏移位址
mov si,offset s2 //si儲存s2標誌所在偏移位址
mov ax,cs:[si]
mov cs:[di],ax //將s標誌處的機器碼改為s2標誌處的機器碼,
s0:jmp short s //跳轉到標誌s處
s1:mov ax,0
int 21h
mov ax,0
s2:jmp short s1
nopcodesg ends
end start
來分析一下上面程式,從**段的start標誌開始執行:
1:mov
ax,0
2:nop
3:nop
4:mov
di,offset
s5:mov
si,offset
s26:mov
ax,cs:[si]
7:mov
cs:[di],ax
/*這裡將cs:[di]處的機器碼改為cs:[si]的,看一
下cs:[si],si是標誌s2處的偏移位址,s2處指令
為 jmp short s1
nop由於轉移指令不是記錄偏移位址,而是轉移的距離,編譯器
算出位址,所以這裡機器碼中儲存s2到s1的距離,由於
向上轉移,所以是負的,大小為位元組數,看一下debug
第8步跳到標誌s中(jmp short s),由於標誌s處機器碼已經改為s2處的機器碼,所以再次跳轉,注意不是跳轉到s1,而是向上跳轉10個位元組,之所以用nop就是為了使得跳轉的位元組大小相同,所以應該跳轉到
程式結束
Linux一些指令
date 檢視日曆 cal 輸出 檢視命令 顯示輸入的內容 echo 顯示文字檔案內容 cat 翻頁顯示檔案內容 只能向下翻頁 more 翻頁顯示檔案內容 帶上下翻頁 less 顯示檔案的頭幾行 預設10行 head n 指定顯示的行數 顯示檔案的末尾幾行 預設10行 tail n f追蹤顯示檔案更...
docker 一些指令
docker run it tomcat 7.0.68 jre8 bin bash 進入容器 root iz25ljx2ojuz command cat create.sh bin bash docker create v logs logs v dockertmp skywalker api sk...
nginx一些指令
啟動nginx start nginx重啟nginx 修改nginx.conf後用此 nginx s reload快速停止nginx,可能不儲存相關資訊.nginx s stop完整有序地停止nginx,儲存相關資訊 nginx s quit重新開啟日誌檔案 需要在nginx啟動中 nginx s ...