本文共 2152 字,大约阅读时间需要 7 分钟。
在汇编语言中,offset 操作符用于获取标号的偏移地址。例如,在以下程序中:
assume code:codesg segmentstart: mov ax, offset start ; mov ax, 0s: mov ax, offset s ; mov ax, 3codesg end
offset 操作符会根据标号的位置计算其在内存中的偏移值。例如,标号 start 位于代码段的起始位置,其偏移地址为 0;标号 s 位于代码段的第二个位置,因此其偏移地址为 3。
在以下程序中,如何使程序在运行中将 s 处的一条指令复制到 s0 处?
assume cs:codesg segmentsegmentstart: mov ax, offset start ; mov ax, 0s: inc ax ; mov ax, 1codesg end
jmp 是无条件转移指令,可以根据需要修改 CPU 的 IP 或同时修改 CS 和 IP。jmp 指令的目标地址可以通过不同的方式指定,并根据转移范围分为短转移和近转移。
jmp short 标号 实现段内短转移,IP 的修改范围为 -128 ~ 127。short 符号表示短转移,编译器会根据标号的位置计算 8 位的位移值。
jmp far ptr 标号 实现段间转移,far ptr 表示转移的目的地址包含段地址和偏移地址。例如:
assume cs:codesg segmentstart: jmp far ptr ss: add ax, 1codesg end
在 Debug 中,jmp far ptr s 会生成机器码 EA 0B 01 D2 1C,其中包含转移的目的地址 0B 01 D2 C1。
jmp 16位 reg 指令的目标地址由寄存器中的值提供。例如:
mov ax, 123hjmp 16 ax
转移地址可以通过内存单元存储。例如:
jmp word ptr ds:[0] 表示从内存单元 ds:[0] 获取一个字作为偏移地址。jmp dword ptr ds:[0] 表示从内存单元 ds:[0] 获取两个字,前一个字是段地址,后一个字是偏移地址。在以下程序中,jmp word ptr [bx+1] 的目标地址在数据段中应该如何定义?
assume cs:code segment?data endscode segmentstart: mov ax, data mov ds, ax mov bx, 0 jmp word ptr [bx+1]code end
答案:只需在 bx+1 处存储偏移地址 0,即可。
jcxz 是有条件转移指令,所有有条件转移指令都是短转移。jcxz 标号 的功能相当于:
if (cx == 0) jmp short 标号
loop 是循环指令,所有循环指令也是短转移。loop 标号 的功能相当于:
(cx)-- if (cx != 0) jmp short 标号
jmp short 标号、jmp near ptr 标号、jcxz 标号 和 loop 标号 这些指令对 IP 的修改是基于转移目的地址与起始地址之间的位移。这种设计使得程序段在内存中的浮动装配更加灵活。
编译器会检查转移位移是否超出范围。如果转移范围超界,编译器会报错。例如:
assume cs:code segmentstart: jmp short sdb 128 dup (0)s: mov ax, 0code end
| JCC 指令 | 中文含义 | 英文原意 | 检查符号位 | 典型 C 应用 |
|---|---|---|---|---|
| JZ/JE | 若为 0 则跳转;若相等则跳转 | jump if zero/equal | ZF=1 | if(i==j);if(i==0) |
| JNZ/JNE | 若不为 0 则跳转;若不相等则跳转 | jump if not zero/equal | ZF=0 | if(i!=j);if(i!=0) |
| JS | 若为负则跳转 | jump if sign | SF=1 | if(i < 0) |
| JNS | 若为正则跳转 | jump if not sign | SF=0 | if(i > 0) |
| JP/JPE | 若 1 出现次数为偶数则跳转 | jump if Parity(Even) | PF=1 | (null) |
以上内容涵盖了 8086 汇编语言中转移指令与操作符的基础知识,涵盖了转移指令的分类、操作方式以及实际应用示例。
转载地址:http://xjtx.baihongyu.com/