博客
关于我
9-汇编转移指令-offset+jmp+jcc+loop
阅读量:278 次
发布时间:2019-03-01

本文共 2130 字,大约阅读时间需要 7 分钟。

8086 汇编语言中的转移指令与操作符

一、操作符 offset

在汇编语言中,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 指令

jmp 是无条件转移指令,可以根据需要修改 CPU 的 IP 或同时修改 CS 和 IP。jmp 指令的目标地址可以通过不同的方式指定,并根据转移范围分为短转移和近转移。

2.1 根据位移进行转移的 jmp 指令

jmp short 标号 实现段内短转移,IP 的修改范围为 -128 ~ 127。short 符号表示短转移,编译器会根据标号的位置计算 8 位的位移值。

2.2 转移的目的地址在指令中的 jmp 指令

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

2.3 转移地址在寄存器中的 jmp 指令

jmp 16位 reg 指令的目标地址由寄存器中的值提供。例如:

mov ax, 123hjmp 16 ax

2.4 转移地址在内存中的 jmp 指令

转移地址可以通过内存单元存储。例如:

  • 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 是有条件转移指令,所有有条件转移指令都是短转移。jcxz 标号 的功能相当于:

if (cx == 0) jmp short 标号

四、loop 指令

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 指令表

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/

你可能感兴趣的文章
Python基础部分-while循环,格式化输出
查看>>
Python基础语法:顺序语句结构
查看>>
Python基础语法:理解代码与写代码
查看>>
Python基础语法:条件和分支
查看>>
Python基础语法:基本数据类型(数字类型和布尔类型)
查看>>
Python基础语法:基本数据类型(列表)
查看>>
Python基础语法:内置函数
查看>>
Python基础语法:你不得不知的几种变量类型
查看>>
Python基础语法教程,零基础入门到精通,看完这一篇就够了
查看>>
Python基础语法与执行脚本的3种方式
查看>>
python基础语法
查看>>
python基础语法
查看>>
python系列【仅供参考】:python测试开发基础---multiprocessing.Pool
查看>>
Python基础综合练习
查看>>
Python基础练习之一输出10000以内的阿姆斯特朗数
查看>>
Python基础系列讲解—动态类型语言的特点
查看>>
python基础系列四:字符串,列表,字典,元组之间的转换
查看>>
python基础篇(9):模块
查看>>
python基础篇(8):异常处理
查看>>
python基础篇(8):字符串常用处理汇总
查看>>