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

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

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

一、操作符 offset

在汇编语言中,offset 操作符用于获取标号的偏移地址。例如,在以下程序中:

assume code:codesg segment
start: mov ax, offset start ; mov ax, 0
s: mov ax, offset s ; mov ax, 3
codesg end

offset 操作符会根据标号的位置计算其在内存中的偏移值。例如,标号 start 位于代码段的起始位置,其偏移地址为 0;标号 s 位于代码段的第二个位置,因此其偏移地址为 3。

例题

在以下程序中,如何使程序在运行中将 s 处的一条指令复制到 s0 处?

assume cs:codesg segment
segment
start: mov ax, offset start ; mov ax, 0
s: inc ax ; mov ax, 1
codesg 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 segment
start: jmp far ptr s
s: add ax, 1
codesg end

在 Debug 中,jmp far ptr s 会生成机器码 EA 0B 01 D2 1C,其中包含转移的目的地址 0B 01 D2 C1

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

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

mov ax, 123h
jmp 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 ends
code segment
start: 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 segment
start: jmp short s
db 128 dup (0)
s: mov ax, 0
code 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/

你可能感兴趣的文章
Node.js的循环与异步问题
查看>>
Node.js高级编程:用Javascript构建可伸缩应用(1)1.1 介绍和安装-安装Node
查看>>
nodejs + socket.io 同时使用http 和 https
查看>>
NodeJS @kubernetes/client-node连接到kubernetes集群的方法
查看>>
NodeJS API简介
查看>>
Nodejs express 获取url参数,post参数的三种方式
查看>>
nodejs http小爬虫
查看>>
nodejs libararies
查看>>
nodejs npm常用命令
查看>>
nodejs npm常用命令
查看>>
Nodejs process.nextTick() 使用详解
查看>>
NodeJS yarn 或 npm如何切换淘宝或国外镜像源
查看>>
nodejs 中间件理解
查看>>
nodejs 创建HTTP服务器详解
查看>>
nodejs 发起 GET 请求示例和 POST 请求示例
查看>>
NodeJS 导入导出模块的方法( 代码演示 )
查看>>
nodejs 开发websocket 笔记
查看>>
nodejs 的 Buffer 详解
查看>>
NodeJS 的环境变量: 开发环境vs生产环境
查看>>
nodejs 读取xlsx文件内容
查看>>