汇编语言学习笔记9——转移指令原理

时间:2022-05-30 00:42:46

8086cpu的转移指令分为以下几类:
-无条件跳转指令
-条件跳转指令
-循环指令
-过程
-中断

offset操作符

offset是伪指令,它的功能是取得标号的偏移地址。

assume cs:code
code segment
start:mov ax,offset start   ;相当于mov ax,0
    s:mov ax,offset s       ;相当于mov ax,3
code ends
end start
jmp指令

jmp指令为无条件转移,可以只修改ip,也可以同时修改CS和IP。
jmp指令要给出的两种信息:
-转移的目的地址;
-转移的距离(段间转移、段内短转移、段内近转移);

段内短转移:
jmp short 标号转到标号处执行指令,可以进行8位位移,它对ip的修改范围为-128~127。

assume cs:code
code segment
start:mov ax,0
      jmp short s   ;直接跳到标号s处执行
      add ax,1
    s:inc ax
code ends
end start

执行jmp short指令后,会将ip加上当前ip地址与跳转目标地址的偏移量。

段内近转移:
jmp near ptr 标号与短转移功能相近,可以进行16位位移,它的位移范围为-32769~32767。

段间转移(远转移):
jmp far ptr 标号可以在段与段之间跳转,会将标号的cs、ip转移到当前cs、ip中。

转移地址在寄存器中的jmp指令:
jmp 16位寄存器,可以将寄存器中的值转移到当前ip中。

转移地址在内存中的jmp指令:

  • jmp word ptr 内存单元地址(段内转移)
    目标内存单元出存放着一个字,是转移的目的偏移地址。
  • jmp dword ptr 内存单元地址(段间转移)
    目标内存单元处存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
    cs=内存单元地址+2
    ip=内存单元地址
jcxz指令

jcxz指令为有条件跳转指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,对ip的修改范围为-128~127。

格式:jcxz 标号,表示如果cx为0,则转移到标号处执行。
相当于:

if(cx==0)
    jmp short 标号;
loop指令

loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含位移,而不是目的地址。

格式:loop 标号
执行:cx=cx-1,如果cx!=0,转移到标号处执行。

根据位移进行转移的意义
jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号

这几种指令对ip的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包括转移的目的地址,而包含的是到目的地址的位移距离。

这样涉及,方便了程序段在内存中的浮动装配。
如果给出具体地址,则程序运行时需要在固定的内存地址,否则会出错。而使用偏移地址则不会出现这样的情况。