轉移指令的原理

2021-09-24 17:29:50 字數 3086 閱讀 2678

可以修改ip,或者同時修改cs和ip的指令統稱為轉移指令。

8086cpu的轉移行為有以下幾類:

根據轉移指令對於ip的修改範圍不同,所以段內轉移又分為:短轉移和近轉移

8086cpu的轉移指令分為以下幾類:

不同轉移指令的轉移條件可能不同,但是轉移的基本原理是相同的

offset是在組合語言中是由編譯器處理的符號,功能為取得標號的偏移位址。也就是相對於**段的偏移位址,就是直接ip值了。

jmp為無條件轉移指令,可以只修改ip,也可以同時修改cs和ip。

jmp指令需要給出兩種資訊:

不同的給出目的位址的方法不同,和不同的轉移位置,對應有不同格式的jmp指令。

jmp short 標號(ip)=(ip)+8位位移

這種格式的jmp指令實現的是段內短轉移。對ip的修改範圍限定為-128~127之間,可以看出正好是乙個位元組能夠表示的範圍。

jmp near ptr 標號(ip)=(ip)+16位位移

jmp short功能相同,只不過他實現的是段內近轉移。簡單來說就是轉移的距離拉長(雖然仍然是在段內)

小貼士

可以看到jmp shortjmp near ptr(段內轉移)並沒有直接將轉移的目的位址直接寫入機器指令中。而是將乙個相對偏移位址寫入了機器指令。(但是debug在對應的彙編指令中會看到偏移位址)

具體來說就是將標號位址相對於jmp指令的下一條指令的位址寫入了機器指令。

也就是說,cpu在執行jmp指令的時候並不需要轉移的目標位址。

前面講到的段內轉移指令其機器指令中並沒有轉移的目的位址,而是相對於當前ip的轉移位移。

jmp far ptr 標號實現段間轉移,又稱為遠轉移。

(cs)=標號所在段的段位址;(ip)=標號在段中的偏移位址

far ptr將標號的位址寫入了彙編指令。

jmp指令的機器碼為ea,可以很明顯的看出來,其中高位址放段位址,低位址放偏移位址。

順便說明,像是jmp 1000:0是在debug中使用的,在彙編**中並不能使用這樣的指令。

指令格式:jmp 16位reg

功能: (ip)=(16位reg)

jmp word ptr 記憶體單元位址(段內轉移)

更改ip值。

jmp dword ptr 記憶體單元位址(段間轉移)

目標記憶體中放著兩個字,其中高位址處的字為轉移目標的段位址,低位址處的字為轉移的目標的段偏移位址。

(cs)=(記憶體單元位址+2)

(ip)=(記憶體單元位址)

jcxz為條件轉移指令。所有的條件轉移指令都是短轉移指令,在對應的機器碼中包含轉移的位移,而不是目的位址。對ip的修改範圍為-128~127.

功能:當cx暫存器的值為0是執行轉移,否則什麼也不做。

loop指令為迴圈指令,所有的迴圈指令都是短轉移。

高階大氣的說法就是方便了程式段在記憶體中的浮動裝配

實際上就是無所謂程式在記憶體中的位址,程式中的轉移指令無需改變。

根據位移進行轉移的指令,他們的轉移範圍收到轉移位移的限制,如果在源程式**現了轉移範圍超界的問題,在編譯的時候,編譯器將會報錯。

就是乙個計算通過相對偏移位置計算偏移位置的問題。

會注意到在執行完mov cs:[di], ax以後,s段的9090(nop nop)變成了ebf6(值為f6eb【小端序】)。同時想到的是同樣都是ebf6卻翻譯出了不同的彙編指令。然而實際上都是相同的,翻譯的問題是編譯器做的。他將機器碼翻譯了以下,也就是將相對偏移位址直接翻譯成為了ip中的偏移位址。

即使上面講到過的偏移位址=jmp的下一條指令位址+相對偏移位址(注意到f6的問題,計算機中的資料以補碼方式儲存)。他就是將偏移位址算了出來。

答案:

assume cs:code, ds:data

data segment

db 'welcome to masm!' ; 文字

db 00000010b, 00100100b, 01110001b ; 屬性

data ends

code segment

start:

mov ax, data

mov ds, ax

mov ax, 0b800h

mov es, ax

mov bx, 0

mov si, 0

mov di, 64

mov bp, 6e0h

mov cx, 3

ln:

mov dx, cx

mov cx, 16

mov bx, 0

mov di, 64

s: mov al, [bx]

mov ah, 16[si]

mov es:[bp].[di], ax

inc bx

add di, 2

loop s

add si, 1

add bp, 160

mov cx, dx

loop ln

mov ax, 4c00h

int 21h

code ends

end start

注意數值不能以字母開頭

來自為知筆記(wiz)

轉移指令的原理

8086cpu的轉移指令分為以下幾類 無條件轉移指令 如 jmp 條件轉移指令 迴圈指令 如 loop 過程中斷 1 操作符offset offset在組合語言中是由編譯器處理的符號,它的功能是取得標號的偏移位址。例 mov si,offset s 2 jmp指令 為無條件轉移指令,可以只修改ip也...

八 彙編 轉移指令的原理

可以修改ip,或者同時修改cs和ip的指令統稱為轉移指令。或者說轉移指令就是可以控制cpu執行記憶體中某處 的指令。8086cpu 轉移行為可以有以下幾類 8086cpu的轉移指令分為 a.取得標號的偏移位址。a.jmp 無條件轉移指令,可以只修改ip,也可以同時修改 cs 和ip。a.jmp sh...

彙編轉移指令jmp原理

在計算機中儲存的都是二進位制數,計算機將記憶體中的某些數當做 某些數當做資料。在根本上,將cs,ip暫存器所指向的記憶體當做 指令轉移就是修改cs,ip暫存器的指向,彙編中提供了一種修改它們的指令 jmp。jmp指令可以修改ip或cs和ip的值來實現指令轉移,指令格式為 jmp 標號 將指令轉移到標...