操作符offset 和 jmp指令

Waffle666發表於2020-11-12

轉移指令的原理

轉移指令:可以修改IP或者同時修改CS和IP的指令(jmp、loop、call)
總的來說,轉移指令就是可以控制CPU執行記憶體中某處程式碼的指令。
8086的轉移行為有一下幾類:

  • 只修改ip時,稱為段內轉移,比如:jmp ax
  • 同時修改cs和ip,稱為段間轉移,比如:jmp 1000:0

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

  • 短轉移IP的修改範圍為:-128~127
  • 近轉移的IP修改範圍為:-32768~32767

loop——》無條件轉移指令
jmp——》條件轉移指令

操作符offset

偽指令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指令佔一個位元組
	    nop
code ends
end s

JMP指令

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在下面

由標號地址-JMP指令後第一個位元組的地址計算得到:(8-D=FB)——》(8-13=-5)
計數器中是沒有減法的——》加上一個負數

涉及到補碼:
將一個正數變成二進位制之後按位取反(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(十六位位移)

相關文章