天天看點

第九章(筆記)

轉移指令是可以修改IP,或同時修改CS和IP的指令

offset 是用于提取标号偏移位址的操作符

jmp在第2章裡說到時用于修改IP或同時修改CS和IP的轉移指令,這章裡單獨的jmp指令是一個無條件的轉移指令

jmp short 标号 是實作段内短轉移

jmp near ptr 标号 是實作段内近轉移 

這兩條指令的機器碼都沒有記錄要轉移的目的位址,而是記錄着執行jmp指令後第一個位元組的位址到目的位址的位移量

而 jmp short 标号 的位移量隻有8位(-128~127)

     jmp near ptr 标号 的位移量就是16位(-32768~32767)

可以通過書本上的一段代碼可以觀察到:

這是書本上讓我們分析的一段奇怪的代碼

assume cs:code

code segment
	mov ax,4c00h
	int 21h

start:  mov ax, 0
    s:  nop
	nop
	
	mov di, offset s   
	mov si, offset s2
	mov ax, cs:[si]     
	mov cs:[di], ax     
	//這是把S2标号所對應位址的機器碼,
        //複制給S标号所對應位址的記憶體單元裡
   s0:  jmp short s

   s1:  mov ax,0
	int 21h
	mov ax,0

   s2:  jmp short si
	nop

code ends

end start
           

通過debug可以觀察到:·

第九章(筆記)

由圖可以看到s2标号處的jmp指令所對應的機器碼是EBF6

那麼mov di, offset s   

mov si, offset s2

mov ax, cs:[si]     

mov cs:[di], ax

這4條指令執行後,s标号處位址對應的記憶體單元存儲着EBF6這機器碼

而F6轉為有符号的十進制是-8,就是說當指令執行到 jmp short s時,就轉移到s标号處執行下一條指令,而這條指令的機器碼是EBF6,而這指令的解釋是(标号所對應的位址-8),

得到的位址就是1455:0000,那麼轉移到1455:0000處繼續執行指令,這位址記憶體單元存儲的指令是mov ax,4c00h

jmp far ptr 标号 是實作段間轉移,又稱為遠轉移,它的轉移時通過指明目标的CS:IP實作的。

jmp word ptr (記憶體單元位址)這是通過記憶體單元裡的資料來指明轉移位址

jmp dword ptr (記憶體單元位址) 這是通過記憶體單元裡的資料來指明轉移的IP和CS

jcxz 這是條件轉移指令(是以條件轉移指令都是短轉移),這條件是cx 為 0 才進行轉移

之前所學的loop指令是屬于轉移指令(所有的循環指令都是短指令)