可以修改ip或同時修改ip和cs的指令統稱為轉移指令。概括地講,轉移指令就是可以控制cpu執行記憶體中某處**的指令。
只修改ip是段內轉移,jmp ax;同時修改cs和ip是段間轉移,jmp 1000:0
由於轉移指令對ip的修改範圍不同,段內轉移又分為短轉移和近轉移
短轉移ip的修改範圍 -128~127
近轉移ip的修改範圍 -32768~32767
8086cpu的轉移指令分為以下幾類。
1.無條件轉移指令(如:jmp)
2.條件轉移指令
3.迴圈指令(如:loop)
4.過程
5.中斷
將s處的一條指令複製到s0處
assume cs:codesg
codesg segment
s:mov ax,bx
mov si,offset s
mov di,offset s0
mov ax,cs:[si]
mov cs:[di],ax
codesg ends
end s
jmp short 標號 短轉移
jmp near ptr 標號 近轉移
這種格式實現的是段內短轉移。-128-127
轉移指令結束後,cs:ip指向標號處的指令
assume cs:codesg
codesg segment
start:mov ax,0
mov bx,0
jmp short s
add ax,1
s:inc ax
code ends
end start
jmp short s指令的讀取和執行
1.cs和ip指向jmp short s所對應的的機器碼 eb03
2.讀取指令eb03進入指令緩衝區
3.cs和ip指向jmp short s 的下一條指令 add ax,1
4.cpu執行指令eb03
5.csip指向inc ax
jmp far ptr 標號指令格式:jmp 16位的reg
功能 :(ip)= 16位reg
1.jmp word ptr 記憶體單元位址段內轉移
偏移位址
2.jmp dword ptr 記憶體單元位址段間轉移
功能:從記憶體單元位址處開始存放著兩個字,高位址處的字是目的位址段位址
低位址是目的偏移位址
db 0,0,0,0,0,0
bx,cs
段位址 0006
偏移位址 00be
jcxz 標號
jcxz是有條件轉移指令,所有的有條件轉移指令都是短轉移。包含的是轉移的位移,而不是目的位址
補全程式設計,利用jcxz指令,實現在記憶體2000h段中查詢第乙個值為0的位元組,找到後,將它的偏移位址儲存在dx中
assume cs:code
code segment
start:mov ax,2000h
mov ds,ax
mov bx,0
s:mov cl,[bx]
mov,ch,0
jcxz ok
inc bx
jmp short s
ok:dx,bx
mov 4c00h
int 21h
code ends
end start
loop 標號 ((cx)=(cx)-1,如果(cx)≠0,轉移到標號處執行)
assume cs:code
code segment
start:mov ax,2000h
mov ds,ax
mov bx,0
s:mov cl,[bx]
mov,ch,0
inc cx
inc bx
loop s
ok:dec bx
mov dx,bx
mov 4c00h
int 21h
code ends
end start
為了方便程式在記憶體中的浮動裝配。
段間:修改cs和ip
段內:修改ip 短轉移**-128~127** 近轉移-32768~32767
《組合語言》(第三版)王爽著 預備
預備 1.2.十進位制 位的概念 數軸表示數字的方式 3.二進位制 4.十進位制轉換成二進位制 5.十進位制快速轉換成二進位制 6.十六進製制 7.十進位制轉換成十六進製制 8.十進位制快速轉換成十六進製制 9.十六進製制和二進位制之間快速互相轉換 10.反過來思考的方式 組合語言是一門低階語言,與...
《組合語言(第三版)》王爽,實驗九
不知道為什麼,在win7下用的emu8086,顯示會錯位,到不了中間位置 在網上找了下別人的 發現即使是在別人那裡能正常顯示在中間位置,複製到我這裡都會顯示為上圖所示的樣子。下面是 定義資料段的時候為了後面不用將ascii碼和屬性分開讀取,就定義成如下這樣比較繁瑣的形式了。其實做的時候第一時間沒想到...
組合語言 (王爽著第三版)實驗二
實驗前要求我們將書本p74的程式段按理論分析,將結果進行填空。之後用debug,將該程式段寫入記憶體,逐條執行之後,根據指令執行後的實際執行的結果填空如下。mov ax,0021 mov ax ffff mov ds ax mov ax 2200 mov ss ax mov sp 0100 mov ...