操作符offset 和 jmp指令

2021-10-10 11:33:21 字數 2037 閱讀 8744

轉移指令:可以修改ip或者同時修改cs和ip的指令(jmp、loop、call)

總的來說,轉移指令就是可以控制cpu執行記憶體中某處**的指令。

8086的轉移行為有一下幾類:

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

loop——》無條件轉移指令

jmp——》條件轉移指令

偽指令offset在組合語言中的由編譯器處理的符號,它的功能是取得標號的偏移位址

assume cs:code

code segment

start: mov ax,offset start ;相當於mov ax,0

;start所標記的是**段的第一條指令,偏移位址為0

s: mov ax,offset s ;相當於mov ax,3

;s所標記的指令是**段中的第二條指令,第一條指令的長度為3byte,則s的偏移位址為3

code ends

end start

問題:有如下程式段,填寫兩條指令,使改程式在執行中將s處的第一條指令複製到s0處:

**如下:

;問題:有如下程式段,填寫兩條指令,使改程式在執行中將s處的第一條指令複製到s0處:

assume cs:code

code segment

s: mov ax,bx ;mov ax,bx機器碼佔兩個位元組

mov si,offset s

mov di,offset s0

mov dx,cs:[si]

;資料從**來

mov cs:[di],dx ;資料到**去

s0: nop ;cpu遇到nop指令什麼都不做,nop指令佔乙個位元組

nopcode ends

end s

8086cpu執行過程

①cpu從cs和ip所組合出來的位址讀取資料,將指令放到指令緩衝器中

②ip=ip+所讀指令的位元組數

③執行指令緩衝器中的內容,跳轉到第一步

jmp s

mov bx,1000h

s: mov ax,1000h ;由觀察可得此時**jmp指令的機器碼是eb04**

再加一條指令:

jmp s

mov bx,1000h

mov bx,1000h

s: mov ax,1000h ;由觀察可得此時**jmp指令的機器碼是eb07**

jmp跳轉指令編譯後的機器碼和指令的長度有關

cpu在執行jmp指令的時候,並不需要跳轉的目的位址就可以實現對ip暫存器的修改,只要做乙個加法就好了

編譯器如何計算指令長度?

標號位址 - jmp指令後第乙個位元組的位址

jmp指令可能存在的乙個問題:

s: mov ax,1000h

jmp s ;jmp在下面

涉及到補碼:

將乙個正數變成二進位制之後按位取反(0變1,1變0),再加1

eg:5的二進位制:0000 0101

取反:1111 1010 +1 =1111 1011(fb)

jmp指令的跳轉範圍:(向前跳 or 向後跳)

;跳轉範圍也叫做位移範圍 八位位移(-128~127)

十六位位移(-32768~32767)

可以指定是八位位移還是十六位位移:

jmp short s(八位位移)

jmp near ptr s(十六位位移)

彙編 OFFSET操作符

offset 找到標記位置的操作符 assume cs code,ds data data segment db 128 dup 0 data ends stack segment db 128 dup 0 stack ends code segment start mov ax,bx mov ax...

LEA指令和OFFSET指令

lea 是機器指令,offset 是偽指令。lea bx,buffer 在實際執行時才會將變數buffer的位址放入bx mov bx,offset buffer 在編譯時就已經計算出buffer的位址為4300 假設 然後將上句替換為 mov bx,4300 lea可以進行比較複雜的計算,比如le...

偽指令dd 和 操作符dup

db define byte 定義位元組型資料 八位資料 dw define word 定義字型資料 十六位資料 dd double word 定義雙字型資料 三十二位資料 比如 data segment dd 1 dw 1 db 1 data ends 可以用debug觀察記憶體分配情況 問題 用...