博客
关于我
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/

你可能感兴趣的文章
Nginx 反向代理解决跨域问题
查看>>
Nginx 反向代理配置去除前缀
查看>>
nginx 后端获取真实ip
查看>>
Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 常用配置清单
查看>>
nginx 常用配置记录
查看>>
Nginx 我们必须知道的那些事
查看>>
Nginx 的 proxy_pass 使用简介
查看>>
Nginx 的配置文件中的 keepalive 介绍
查看>>
Nginx 负载均衡与权重配置解析
查看>>
Nginx 负载均衡详解
查看>>
nginx 配置 单页面应用的解决方案
查看>>
nginx 配置https(一)—— 自签名证书
查看>>
nginx 配置~~~本身就是一个静态资源的服务器
查看>>
Nginx 配置解析:从基础到高级应用指南
查看>>
nginx+Tomcat性能监控
查看>>
Nginx下配置codeigniter框架方法
查看>>
nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:128
查看>>
nginx添加模块与https支持
查看>>