Java教程

九--转移指令的原理

本文主要是介绍九--转移指令的原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

8086转移行为分为:

  只修改IP,称为段内转移,如:jmp ax

  同时修改CS和IP,称为段间转移,如jmp 1000:0

根据转移指令对IP的不同修改范围,段内转移分为:

  短转移:IP修改范围为-128~127

  近转移:IP修改范围为-32768~32767

8086的转移指令分为:

  无条件转移指令(如jmp)

  条件转移指令

  循环指令(如loop)

  过程

  中断

1.操作符offset

  offset是由编译器处理的符号,功能是取得标号处的偏移地址

  

 

 2.jmp指令

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

  jmp指令要给出两种信息:

    转移的目的地址

    转移的距离(段间转移、段内短转移、段内近转移)

3.根据位移进行转移的jmp指令

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

    向前转移时最多越过128个字节,向后转移时最多越过127个字节,转移结束后,CS:IP指向标号处指令

    

 

   

 

   一般的汇编指令,idata不论它是一个数据还是内存单元的偏移地址,都会在对应的机器指令中出现。

  

 

  debug将jmp short s中的s表示为inc ax指令的偏移地址8,jmp short s表示为jmp 0008,表示转到CS:0008处

  但机器码中却不包含0008

  cpu在执行jmp指令时不需要转移的目标地址

  EB 03没告诉cpu目标地址,却告诉了cpu要转移的位移,即令IP向后移动三个字节

  实际上“jmp short 标号”的功能是:(IP)=(IP)+8位位移

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

  ②short指明此处的位移为8位位移,补码表示

  ③8位位移的范围为-127~128

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

  与jmp short类似,“jmp near ptr 标号”实现段内近转移,功能为(IP)=(IP)+16位位移

  ①16位位移=标号处的地址-jmp指令后的第一个字节的地址

  ②near ptr指明此处的位移为16位位移,进行的是段内近转移

  ③16位位移的范围为-32768~32767,用补码表示

  16位位移由编译程序在编译时算出

 4.转移的目的地址在指令中的jmp指令

  jmp far prt 标号,实现段间转移,又称为远转移

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

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

    far ptr指明了用标号的段地址和偏移地址修改CS和IP

  

 

  jmp far ptr s对应EA 0B 01 BD 0B,其中包含目的地址“0B 01 BD 0B”

    高地址BD 0B是段地址0BBDH,低地址0B 01是偏移地址010BH

5.转移地址在寄存器中的jmp指令

  jmp 16位reg

  功能(IP)=(16位reg)

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

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

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

    内存单元地址可用寻址方式的任一格式给出

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

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

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

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

 7.jcxz指令

  jcxz:有条件转移指令  

  所有有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址

  格式:jcxz 标号

    如果(cx)=0 转移到标号处执行

    (cx)=0时,(IP)=(IP)+8位位移

    (cx)!=0时,什么也不做

    相当于if((cx)==0)jmp short 标号

8.loop指令

  所有循环指令都是短转移

9.根据位移进行转移的意义

10.编译器对转移位移超界的检测

 

这篇关于九--转移指令的原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!