转移指令的原理

可以修改IP,或同时修改CS和IP的指令统称为转移指令。

8086cpu的转移指令分为以下几类:

  • 无条件转移指令(如:jmp)
  • 条件转移指令
  • 循环指令
  • 过程
  • 中断

一、offset

操作符offset在汇编语言中是编译器处理的符号,功能是取得标号的偏移地址。

assume cs:codesg
codesg segment
	start:mov ax,offset start   ;相当于mov ax,0
		s:mov ax,offset s		;相当于mov ax,3,前面一条指令的长度为3个字节
codesg ends
end start

二、jmp(无条件转移指令)

jmp可以只修改IP,也可以同时修改CS和IP。

修改IP,段内转移

jmp short 标号
;(IP)=(IP)+8位位移
jmp near ptr 标号
;(IP)=(IP)+16位位移

CPU在执行jmp指令时并不需要转移的目的地址,而是地址偏移。

image-20241212123530410

段间转移

jmp far ptr 标号
;(CS)=标号所在段的段地址;(IP)=标号所在段的偏移地址

转移地址在寄存器

jmp 16位reg
;(IP)=(16位reg)

转移地址在内存中

jmp word ptr 内存单元地址  ;段内转移
jmp dword ptr 内存单元地址 ;段间转移
(CS)=(内存单元地址+2)
(IP)=(内存单元地址)

三、jcxz(有条件转移指令)

jcxz 标号 ;如果(CX)=0,转移到标号处执行,所有有条件转移都是短转移,对IP的修改范围为-128~127

四、loop

loop 标号 ;(CX)=(CX)-1,如果(CX)!=0,转移到标号处执行,短转移,对IP修改范围为-128~127

五、ret和call