9.1 ~ 9.6
《汇编语言(第3版)》9.1 ~ 9.6、《零基础入门学习汇编语言》P43 ~ 44
第九章 转移指令的原理
8086 CPU 的转移指令分为以下几类
- 无条件转移指令(如:jmp)
- 条件转移指令
- 循环指令(如:loop)
- 过程
- 中断
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 指令要给出两种信息
- 转移的目的地址
- 转移的距离(段间转移、段内短转移、段内近转移)
9.3 依据位移进行转移的 jmp 指令
jmp short 标号(转到标号处执行指令):这种格式的 jmp 指令实现的是段内短转移,它对 IP 的修改范围为 -128~127,也就是说,它向前转移时可以最多越过 128 个字节,向后转移可以最多越过 127 个字节。
汇编指令与机器码的对应示例
汇编指令 | 机器指令 |
---|---|
mov ax,0123 | B8 23 01 |
mov ax,ds:[0123] | A1 23 01 |
push ds:[0123] | FF 36 23 01 |
可以看到,在一般的汇编指令中,汇编指令中的 idata(立即数),不论它是表示一个数据还是内存单元的偏移地址,都会在对应的机器指令中出现,因为 CPU 执行的是机器指令,它必须要处理这些数据或地址。
内存地址 | 机器码 | 伪指令 |
---|---|---|
0BBD:0000 | B80000 | MOV AX,0000 |
0BBD:0003 | BB0000 | MOV BX,0000 |
0BBD:0006 | EB03 | JMP 000B |
0BBD:0008 | 050100 | ADD AX,0001 |
0BBD:000B | 40 | INC AX |
jmp short s 指令的读取和执行过程
- (CS)=0BBDH,(IP)=0006,CS:IP 指向 EB 03(jmp short s 的机器码);
- 读取指令码 EB 03 进入指令缓冲器;
- (IP)=(IP)+ 所读取指令的长度 =(IP)+2=0008,CS:IP 指向 add ax,1;
- CPU 执行指令缓冲器中的指令 EB 03;
- 指令 EB 03 执行后,(IP)=000BH,CS:IP 指向 inc ax。
实际上,指令“jmp short 标号”的功能为 (IP)=(IP)+8 位位移。
- 8 位位移 =“标号”处的地址 -jmp 指令后的第一个字节的地址;
- short 指明此处的位移为 8 位位移;
- 8 位位移的范围为 -128~127,用补码表示
- 8 位位移由编译程序在编译时算出。
还有一种和指令“jmp short 标号”功能相近的指令格式:jmp near ptr 标号。
它实现的是段内近转移。
指令“jmp near ptr 标号”的功能为:(IP)=(IP)+16 位位移。
指令“jmp near ptr 标号”的说明
- 16 位位移 =“标号”处的地址 -jmp 指令后的第一个字节的地址;
- near ptr 指明此处的位移为 16 位位移,进行的是段内近转移;
- 16 位位移的范围为 -32768~32767,用补码表示;
- 16 位位移由编译程序在编译时算出。
9.4 转移的目的地址在指令中的 jmp 指令
前面讲的 jmp 指令,其对应的机器码中并没有转移的目的地址,而是相对于当前 IP 的转移位移。
指令“jmp far ptr 标号”实现的是段间转移,又称为远转移。
指令“jmp far ptr 标号”功能如下
- (CS)= 标号所在段的段地址;
- (IP)= 标号所在段中的偏移地址。
- far ptr 指明了指令用标号的段地址和偏移地址修改 CS 和 IP。
9.6 转移地址在内存中的 jmp 指令
转移地址在内存中的 jmp 指令有两种格式
jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
内存单元地址可用寻址方式的任一格式给出。
示例
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
jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
(CS)=(内存单元地址+2)
(IP)=(内存单元地址)
内存单元地址可用寻址方式的任一格式给出。
示例
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。