美文网首页
8086汇编(22)转移指令

8086汇编(22)转移指令

作者: 迷心迷 | 来源:发表于2019-04-04 17:45 被阅读0次

转移指令

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

8086CPU的转移行为有以下几类。

  • 只修改IP时,称为段内转移,例如:jmp ax。
  • 同时修改CS和IP时,称为段间转移,例如:jmp 1000:0。

由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移。

  • 短转移IP的修改范围为-128~127。
  • 近转移IP的修改范围为-32768~32767。

8086CPU的转移指令分为以下几类。

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

2、jmp指令

jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。

jmp指令要给出两种信息。

  • 转移的目的地址
  • 转移的距离(段间转移、段内短转移、段内近转移)

几种jmp指令:

1)jmp short 标号(转到标号处执行指令)

这种格式的jmp指令实现的是段内短转移,它对IP的修改范围是-128~127。

"jmp short 标号"指令对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移。这个位移,是编译器根据汇编指令中的"标号"计算出来的

1.png

实际上:"jmp short 标号"的功能为:(IP)=(IP)+8位位移

  • 8位位移=标号处的地址-jmp指令后的第一个字节的地址
  • short指明此处的位移为8位位移
  • 8位位移的范围是-128~127,用补码表示
  • 8位位移由编译程序在编译时算出。

2)还有一种和"jmp short 标号"功能相近的指令格式, jmp near ptr 标号,它实现的是段内近转移。

"jmp near ptr 标号"的功能为:(IP)=(IP)+16位位移。

  • 16位位移=标号处的地址-jmp指令后的第一个字节的地址
  • near ptr指明此处的位移为16位位移,进行的是段内近转移
  • 16位位移的范围为-32768~32767,用补码表示
  • 16位位移由编译程序在编译时算出。

3)"jmp far ptr 标号"实现的是段间转移,又称为远转移。功能如下:

(CS)=标号所在段的段地址;

(IP)=标号在段中的偏移地址。

2.png

jmp far ptr s所对应的机器码:EA 0B 01 BD 0B,其中包含转移的目的地址,"0B 01 BD 0B"是目的地址在指令中的存储顺序,高地址的"BD 0B"是转移的段地址:0BBDH,低地址的"0B 01"是偏移地址:010BH。

4)jmp 16位寄存器

功能:(IP)=(16位寄存器)

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

  • jmp word ptr 内存单元地址(段内转移)

功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。

  • jmp dword ptr 内存单元地址(段间转移)

功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。

(CS)=(内存单元地址+2)

(IP)=(内存单元地址)

6)jcxz指令

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

指令格式:jcxz 标号(如果(cx)=0, 转移到标号处执行。)

操作:当(cx)=0时,(IP)=(IP)+8位位移;

8位位移=标号处的地址-jcxz指令后的第一个字节的地址;

8位位移的范围为-128~127,用补码表示;

8位位移由编译程序在编译时算出。

当(cx)!=0时,什么也不做(程序向下执行)。

7)loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为:-128~127。

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

操作:

  • (cx)=(cx)-1
  • 如果(cx)!=0, (IP)=(IP)+8位位移。

8位位移=标号处的地址-loop指令后的第一个字节的地址;

8位位移的范围为-128~127,用补码表示;

8位位移由编译程序在编译时算出。

如果(cx)=0.什么也不做(程序向下执行)。

总结:

根据位移进行转移,在它们对应的机器码中不包含目的地址,而包含的是到目的地址的位移。这种设计,方便了程序段在内存中的浮动装配,保证一段程序在内存中的不同位置都可正确执行。

分析一个奇怪的程序。

assume cs:codesg

codesg 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

s0:
               jmp short  s

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

s2:
               jmp short s1
               nop

codesg ends

end start

程序执行顺序

mov ax,0

nop

nop

mov di,offset s

mov si,offset s2

mov ax,cs:[si]

mov cs:[di],ax

此时将s2处的代码"jmp short s1"拷贝到了s:处,刚好替换了两个nop指令的位置。

接着实行jmp short s,跳转到标号s处

执行s处替换后的代码jmp short s1,由于短转移时根据位移找指令,本来的位移是s2-s1,间距是以下代码

mov ax,0

int 21h

mov ax,0

是10个字节代码,也就是向上偏移10个字节执行。

所以此时是在s标号处向上偏移10个字节执行代码

mov ax,4c00h

int 21h

程序正常结束。

相关文章

  • 8086汇编(22)转移指令

    转移指令 1、可以修改IP,或同时修改CS和IP的指令统称为转移指令。 8086CPU的转移行为有以下几类。 只修...

  • 汇编笔记4(跳转)

    第9章(转移指令): 8086转移指令: 无条件转移指令,条件转移指令,循环指令,过程,中断 offset(伪指令...

  • 在Mac上学习汇编-8086微处理器

    最近在学习王爽的《汇编语言》,里面的实验环境是用8086CPU的DOS来学习机器指令和汇编指令。如果用mac的话,...

  • 汇编语言 学习笔记 (二)

    汇编语言学习笔记 三、8086基本指令 数据传送指令 通用数据传送指令 1. MOV传送指令 a. 对标志位无影响...

  • 8086汇编(35)sbb指令

    sbb指令 sbb是带借位减法指令,它利用了CF位上记录的借位值。 指令格式:sbb 操作对象1,操作对象2 功能...

  • 8086汇编(34)adc指令

    adc指令 adc是带进位加法指令,它利用了CF位上记录的进位值。 指令格式: adc 操作对象1,操作对象2 功...

  • 8086汇编(36)cmp指令

    cmp指令 cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响...

  • 8086汇编(42)int指令

    int指令 int指令的格式为:int n,n为中断类型码,它的功能是引发中断过程。 CPU执行int n指令,相...

  • AT&T汇编-函数实例

    AT&T 基于x86架构处理器汇编指令一般有2种格式:Intel汇编和AT&T汇编,通过对8086汇编的学习包括对...

  • 8086 指令系统寻址方式

    整理汇编语言学习笔记,回顾一下8086 指令系统的寻址方式。 寻址与指令 寻址方式(Addressing Mode...

网友评论

      本文标题:8086汇编(22)转移指令

      本文链接:https://www.haomeiwen.com/subject/zzpqiqtx.html