博客
关于我
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在gpu上运行_【python】python开启GPU加速
查看>>
Python在def函数中使用for循环
查看>>
Python在def函数中使用for循环
查看>>
Python在Conda环境中,但在Windows虚拟环境中没有激活
查看>>
python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
查看>>
python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
查看>>
Python图像处理:从内存加载jpeg
查看>>
python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
查看>>
python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
查看>>
python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
查看>>
python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
查看>>
Python哪个版本最稳定好用2023.10.19
查看>>
Python和黑客技术的渊源
查看>>
Python和RF编写接口自动化
查看>>
python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
查看>>
python和java哪个更值得学——来自知乎高赞回答
查看>>
python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
查看>>
Python命名中尾随下划线有什么好处?
查看>>
Python启动脚本
查看>>
Python听写汇总结果
查看>>