[汇编学习笔记][第九章转移指令的原理]
第九章 转移指令的原理
分类
-
jmp转移行为
- 段内转移
- 短转移 IP修改范围-128~127
- 近转移 IP修改范围-32768~32768
- 段间转移
- 段内转移
-
几个其余转移
- 无条件转移(如:jmp)
- 条件转移
- 循环指令(如:loop)
- 过程
- 中断
通过深入理解转移指令jmp来理解CPU执行转移指令的基本原理
9.1 操作符offset
操作符offset
是伪指令,取得标号的偏移地址。
还可以在标号出现之前使用,反正标号最后由编译器统一处理
9.2 jmp指令
两种语法
- 转移目的地址
- 转移的距离
9.3 根据位移进行的jmp指令
jmp short 标号(转到标号处执行指令)
-
标号会被编译器翻译为
IP
-
CPU在执行
jmp指令
的时候并不需要转移的 目标地址 -
jmp short 标号
指令所对应的机器码中,不包含转移的地址,而包含的是转移的位移。这个位移是编译器根据标号计算出来的
-
所以
jmp short 标号
的功能为:(IP)=(IP)+8位位移(-128~127)- 8位位移=标号地址-jmp指令后的第一个字节的地址
- short表明为8位位移,负数用补码表示
-
还有一种
jmp near ptr 标号
的功能为:(IP)=(IP)+16位位移- 16位位移=标号地址-jmp指令后的第一个字节的地址
near ptr
表示段内近转移
9.4 根据目的进行的jmp指令
-
jmp far ptr 标号
-
标号会被编译器翻译为
CS:IP
-
在机器指令中也是用
CS:IP
来指定目标地址,而不是通过位移
9.5 转移地址在寄存器中的jmp指令
jmp 16位reg
-
(IP)=(16位reg)
-
与之对应的机器指令有什么含义?
9.6 转移地址在内存中的jmp指令
-
jmp word ptr 内存单元地址
(段内转移)使
IP=[内存单元地址]
,因为IP是一个word
,所以必须要jmp word
,没有jmp byte
-
jmp dword ptr 内存单元地址
(段间转移)内存单元存放两个字,高地址表示段地址,低地址表示偏移地址
- CS=(内存单元)+2
- IP+(内存单元)
9.7 jcxz指令
jcxz
指令为有条件转移指令,所有的有条件转移指定都是 短转移。
对IP的修改范围位-128~127
- 格式:
jcxz 标号
- 操作: 当(cx)=0 时,IP=(IP)+8位位移
-
等于
if((cx)==0) jmp short 标号
9.8 loop指令
loop
指令为循环指令,所有的循环指令都是短转移
- 格式 loop 标号
-
操作:
- (cx)=(cx)-1
- 如果(cx)!=0 ,(IP)=(IP)+8位位移
-
等于
(cx)--; if((cx)!=0) jmp short 标号
9.9 根据位移进行转移的意义
有利于程序段在内存中的浮动装配,是的程序段加载到内存什么位置都没有问题
9.10 编译器对转移位移超界的检测
如果转移范围超界,编译的时候,编译器会报错。