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

引言

  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 编译器对转移位移超界的检测

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

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

     《汇编语言》第三版

时间: 2024-09-30 19:23:04

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

王爽汇编语言第三版第5章实验4

第(3)小题 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序.上机调试,跟踪运行结果. assume cs:code code segment mov ax,     cs       ;cs为程序入口的段地址,我们就是要从这里开始复制 mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,     cx        ;程序刚加载完成时,cx存放的是程序的大小,这里我不确定答案,我试过后看到mov ax,4

Java 线程第三版 第九章 Thread调度 读书笔记

一.Thread调度的概述 import java.util.*; import java.text.*; public class Task implements Runnable { long n; String id; private long fib(long n) { if (n == 0) return 0L; if (n == 1) return 1L; return fib(n - 1) + fib(n - 2); } public Task(long n, String id)

汇编语言学习第九章-转移指令的原理

本博文系列参考自<<汇编语言>>第三版,作者:王爽 可以修改IP寄存器的值,或者同时修改CS与IP的值的指令称为转移指令.转移指令的功能就是使得CPU执行内存中某段特定的指令或程序. 8086CPU的转移行为分为如下几类: 1.只改变IP值,称为段内转移.比如 jmp ax;段内转移又分为短转移和近转移.短转移IP的修改范围为-128~127,近转移IP的修改范围为-32768~32767. 2.同时改变CS:IP的值称为段间转移.比如 jmp 1000:0 8086CPU的转移指

【汇编语言】(王爽著第三版)实验二

实验二 实验任务(一) 实验前要求我们将书本P74的程序段按理论分析,将结果进行填空.之后用Debug,将该程序段写入内存,逐条执行之后, 根据指令执行后的实际运行的结果填空如下. mov ax,0021 mov  ax , ffff mov  ds , ax mov  ax , 2200 mov  ss , ax mov  sp , 0100 mov  ax , [0]                       ;ax=3130 add  ax , [2]                 

汇编语言第三版 第二章 寄存器

问题1.8086CPU的地址总线为20bit,而数据总线为16bit--也就是说每次传输的数据为16bit,那么如何使用16bit的数据总线来实现20bit的地址总线的地址传输? 答:8086CPU使用两个16bit的地址合成一个20bit的物理地址. 16bit A: XXXX 16bit B: XXXX 20bit物理地址的合成 A *16 也就是将A(16进制表示的数值),向左移动一位,然后加上B.A * 16  +  B.物理地址 = 段地址 * 16 + 偏移地址 16bit A: X

王爽汇编第三版检测点10.5

(1)下面的程序执行后,ax 中的数值是多少? 1 assume cs:code 2 stack segment 3 dw 8 dup (0) 4 stack ends 5 code segment 6 start: mov ax,stack 7 mov ss,ax 8 mov sp,16 9 mov ds,ax 10 mov ax,0 11 call word ptr ds:[0] 12 inc ax 13 inc ax 14 inc ax 15 mov ax,4c00h 16 int 21h

王爽汇编第三版实验10

1. 显示字符串 1 assume cs:code 2 3 data segment 4 db 'Welcome to masm!',0 5 data ends 6 7 stack segment 8 db 16 dup (0) 9 stack ends 10 11 code segment 12 start: 13 mov dh,8 14 mov dl,3 15 mov cl,2 16 mov ax,data 17 mov ds,ax 18 mov si,0 19 call show_str

汇编语言:第九章 转移指令的原理

可以修改IP或者CS:IP的指令叫做转移指令. 只修改IP,称为段内转移如jmp ax,根据对IP修改的范围不同分为短转移和近转移,范围分别为-128到127和-32768到32767 同时修改CS和IP的指令称为段间转移,如jmp 1000:0 9.1 offset offset 标号,用于取标号的偏移地址,如mov ax,offset start 相当于mov ax,0   start为代码段的标号 9.2 jmp指令 jmp是无条件转移指令,可以修改IP或者CS:IP都修改 jmp指令给出

第九章 转移指令的原理

引言 8086CPU的转移指令分为以下几类: 无条件转移指令(如:jmp) 条件转移指令 循环指令(如:loop) 过程(函数的调用过程) 中断 9.1 操作符 offset 9.2 jmp 指令 9.3 依据位移进行转移的 jmp 指令 9.4 转移的目的地址在指令中的 jmp 指令 9.5 转移地址在寄存器中的 jmp 指令 9.6 转移地址在内存中的 jmp 指令 9.7 jcxz 指令 9.8 loop 指令 9.9 根据位移进行转移的意义 9.10 编译器对转移位移越界的检测 原文地址