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

可以修改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指令给出以下两种信息之一:

(1)转移目的地址

(2)转移位移

9.3 根据位移进行转移

jmp short 标号  表示段内短转移,8个字节长度表示位移量,因此可以表示范围是:向前转移128字节到向后转移127字节

      即 IP=IP+8位位移,8位位移=标号偏移地址 - jmp的下一条指令的偏移地址

jmp near ptr 标号   表示段内近转移,IP=IP+16位位移

这两种转移 在编译器编译后给出目标地址,但是机器码会给出位移地址

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

jmp far ptr 标号,实现段间转移也叫远转移,将标号的段地址和偏移地址放入CS:IP中

这种转移 编译器编译后给出目标地址,机器码也指定转移的目标地址

9.5 转移地址在jmp中

jmp 16位reg

IP = 16位reg值

9.6 转移地址在内存中

jmp word ptr 内存单元地址: 将内存单元处字单元作为IP的值

jmp dword ptr 内存单元地址: 将内存单元处第一个字单元作为IP值,第二个字单元作为CS值

检测点9.1

(1) 程序如下:

assume cs:code

data segment

?

data ends

code segment

start:

mov ax,data

mov ds,ax

mov bx,0

jmp word ptr [bx+1]

code ends

end start

要使jmp执行后CS:IP指向程度第一条指令,data中应该怎么填?

分析:  jmp word ptr [1] 就是把1地址字单元值放入IP,即让CS:IP指向CS:0,所以让1地址字单元值为0

     所以data里应该是db 0,0,0

(2)程序如下

assume cs:code

data segment

dd 12345678H

data ends

code segment

start:

mov ax,data

mov ds,ax

mov bx,0

mov [bx],

mov [bx+2],

jmp dword ptr ds:[0]

code ends

end start

补全程序使jmp执行后CS:IP指向程序第一条指令

分析: jmp dword ptr ds:[0] 表示让0地址字单元放入IP2地址字单元放入CS中

所以让0地址字单元变成0,2地址字单元变成CS,

所以: mov [bx],bx   此处不可以用 mov [bx],0 因为需要确定指令数据长度

      mov [bx+2],cs

(3)用Debug 查看内存,结果如下:

2000:1000 BE 00 06 00 00 00 .....

则此时,CPU执行指令

mov ax,2000H

mov es,ax

jmp dword ptr es:[1000H]

后 CS = 0006H,  IP = 00BEH

9.7

原文地址:https://www.cnblogs.com/superzhao/p/4666781.html