码迷,mamicode.com
首页 > 编程语言 > 详细

王爽《汇编语言》第三版 第九章 转移指令的原理

时间:2017-02-01 16:32:43      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:fse   add   处理   偏移地址   分享   ima   class   读取   style   

引言

  8086CPU的转移指令分为以下几类:
    无条件转移指令 (如:jmp)
    条件转移指令
    循环指令(如:loop)
    过程
    中断

 

9.1 操作符offset

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


9.2 jmp指令

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


9.3 依据位移进行转移的jmp指令

  jmp short 标号(转到标号处执行指令)这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时最多越过128个字节,向后转移最多越过127个字节。

  CPU 在执行EB 03(EB为jmp short的机器码)的时候,并不知道转移目的地址。

  技术分享

  jmp short s指令的读取和执行过程:
  1.(CS)=0BBDH,(IP)=0006,CS:IP指向EB 03(jmp short s的机器码);
  2.读取指令码EB 03进入指令缓冲器;
  3.(IP)=(IP)+所读取指令的长度=(IP)+2=0008,CS:IP指向add ax,1;
  4.CPU指行指令缓冲器中的指令EB 03;
  5.指令EB 03执行后,(IP)=000BH,CS:IP指向inc ax。

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


9.4 转移的目的地址在指令中的jmp指令

  jmp short(near)指令,其对应的机器码中并没有转移的目的地址,而是相对于当前IP的转移位移。

  指令 “jmp far ptr 标号” 实现的是段间转移,又称为远转移:
  1.(CS)=标号所在段的段地址;
  2.(IP)=标号所在段中的偏移地址。
  3.far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。

  技术分享技术分享


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

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


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

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


9.7 jcxz指令

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

  jcxz 标号 指令操作:当(cx)=0时,(IP)=(IP)+8位位移)。

  我们从 jcxz的功能中可以看出,指令“jcxz 标号”的功能相当于:if((cx)==0) jmp  short 标号;


9.8 loop指令


9.9 根据位移进行转移的意义

  jmp short 标号、jmp near ptr 标号、jcxz 标号、loop 标号等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。不包含转移的目的地址,而包含的是到目的地址的位移距离。方便了程序段在内存中的浮动装配。

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

  根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。

 

参考资料:《小甲鱼汇编零基础入门》

 

     《汇编语言》第三版

王爽《汇编语言》第三版 第九章 转移指令的原理

标签:fse   add   处理   偏移地址   分享   ima   class   读取   style   

原文地址:http://www.cnblogs.com/mubu/p/6360061.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!