1. 预备知识
-
转移指令指可以修改 IP 或同时修改 CS 和 IP 的指令,即转移指令可以控制 CPU 去执行内存中的某处代码。
-
在 8086CPU 中,转移指令分为以下几类:无条件转移指令(如 jmp),条件转移指令(如 jcxz),循环指令(如 loop),过程(子程序),中断(如 int 21h)。
-
只修改 IP (不修改 CS)的转移称为段内转移,同时修改 CS 和 IP 的转移称为段间转移。
-
jcxz 指令的基本格式为 jcxz 标号。如果 (cx)=0 则转移至标号处,否则程序向下执行。
-
转移指令根据位移进行转移,方便程序段在内存中的浮动装配。由于转移指令仅涉及目的地址的偏移,程序在内存中的不同位置都可以正确执行。
2. 实验任务
利用 jcxz 指令,实现在内存 075AH 第一个值为 0 的字节,并将其偏移地址存储在 dx 中。
2.1 实验分析
实验要求从 075A:0000 处开始查找第一个值为 0 的字节,可使用 jmp 指令或循环指令完成,找到满足条件的字节后,通过 jcxz 的特性转移并退出程序。整体代码为:
assume cs:code
code segment
start:
mov ax,075Ah
mov ds,ax ;段寄存器DS指向075AH段
mov bx,0
s:
mov cl,ds:[bx] ;读取内存中的字节
mov ch,0 ;将CH设置为0,通过CL即可判断CX的内容
jcxz ok ;如果(CX)=0则跳转至标号ok处
add bx,1 ;偏移一个字节
jmp short s ;如果(CX)≠0则跳转至标号s处
ok:
mov dx,bx ;将偏移地址存储在DX中
mov ax,4c00h
int 21h
code ends
end start
2.2 实验结果
程序运行前,首先查看 1000:0000 内存处的内容:
第一个为零的字节的地址为 075A:0004,对应的偏移地址为 4H。程序运行后,寄存器 BX 的内容:
再来看上述汇编代码对应机器码:
红色部分为 jcxz 指令及其对应的机器码,机器码 E305 中的 E3 为操作数、05 表示转移位移,往后数 5 个字节刚好为指令 mov dx,ax 的地址。同理,蓝色部分为 jmp 指令及其对应的机器码,机器码 EBF5 中的 EB 为操作数、F5 表示转移位移,F5 是负数 -11 的补码,往前数 11 个字节刚好为 mov cl,ds:[bx] 的地址。
这样,根据位移进行转移使程序装在内存中的不同位置均可以执行。因为转移指令只涉及到转移位移,而不是标号的地址。这样,无论程序装载在内存的什么位置,程序均可以正确执行。
3. 总结
-
本文主要介绍了汇编语言中的转移指令的使用,转移根据转移位移确定目的地址
-
参考:汇编语言/王爽著.——北京:清华大学出版社,2003