9.1 ~ 9.6

2020-04-02
2020-04-02
3 min read
Hits

  《汇编语言(第3版)》9.1 ~ 9.6、《零基础入门学习汇编语言》P43 ~ 44

第九章 转移指令的原理

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

  1. 无条件转移指令(如:jmp)
  2. 条件转移指令
  3. 循环指令(如:loop)
  4. 过程
  5. 中断

9.1 操作符 offset

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

assume cs:codesg
codesg segment

start:mov ax,offset start     # 相当于 mov ax,0
s:mov ax,offset s     # 相当于 mov ax,3

codesg ends
end start

9.2 jmp 指令

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

  jmp 指令要给出两种信息

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

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

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

  汇编指令与机器码的对应示例

汇编指令机器指令
mov ax,0123B8 23 01
mov ax,ds:[0123]A1 23 01
push ds:[0123]FF 36 23 01

  可以看到,在一般的汇编指令中,汇编指令中的 idata(立即数),不论它是表示一个数据还是内存单元的偏移地址,都会在对应的机器指令中出现,因为 CPU 执行的是机器指令,它必须要处理这些数据或地址。

内存地址机器码伪指令
0BBD:0000B80000MOV AX,0000
0BBD:0003BB0000MOV BX,0000
0BBD:0006EB03JMP 000B
0BBD:0008050100ADD AX,0001
0BBD:000B40INC AX

  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 short 标号”的功能为 (IP)=(IP)+8 位位移。

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

  还有一种和指令“jmp short 标号”功能相近的指令格式:jmp near ptr 标号。

  它实现的是段内近转移

  指令“jmp near ptr 标号”的功能为:(IP)=(IP)+16 位位移。

  指令“jmp near ptr 标号”的说明

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

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

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

  指令“jmp far ptr 标号”实现的是段间转移,又称为远转移

  指令“jmp far ptr 标号”功能如下

  1. (CS)= 标号所在段的段地址;
  2. (IP)= 标号所在段中的偏移地址。
  3. far ptr 指明了指令用标号的段地址和偏移地址修改 CS 和 IP。

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

  转移地址在内存中的 jmp 指令有两种格式

  1. jmp word ptr 内存单元地址(段内转移

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

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

    3. 示例

      mov ax,0123H
      mov ds:[0],ax
      jmp word ptr ds:[0]     # 相当于 jmp ax
      执行后,(IP)=0123H
      
      mov ax,0123H
      mov [bx],ax
      jmp word ptr [bx]
      执行后,(IP)=0123H
      
  2. jmp dword ptr 内存单元地址(段间转移

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

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

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

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

    5. 示例

      mov ax,0123H
      mov ds:[0],ax
      mov word ptr ds:[2],0
      jmp dword ptr ds:[0]
      执行后,(CS)=0,(IP)=0123H,CS:IP 指向 0000:0123。
      
      mov ax,0123H
      mov [bx],ax
      mov word ptr [bx+2],0
      jmp dword ptr [bx]
      执行后,(CS)=0,(IP)=0123H,CS:IP 指向 0000:0123。
      
Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.
Previous 9.7 ~ 9.9