天天看点

第九章(笔记)

转移指令是可以修改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指令是属于转移指令(所有的循环指令都是短指令)