汇编语言之转移指令和原理



1、引言

可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存

中某处代码的指令。

8086CPU的转移行为有以下几类:

1. 同时修改CS和IP时,称为段间转移,比如:jmp 100:2a7。

2. 只修改IP时,称为段内转移,比如:jmp ax。

由于转移指令对IP的修改范围不同,段内转移又分为“短转移”和“近转移”。

3. 段内短转移IP的修改范围为-128~127。

4. 段内近转移IP的修改范围为-32768~32767。

8086CPU的转移指令分为以下几类:

1. 无条件转移指令(比如:jmp)

2. 条件转移指令

3. 循环指令

4. 过程

5. 中断

这些转移指令转移的前提条件可能不同,但转移的基本原理是相同的,我们在这一章主要通过深入学习无条件

转移指令jmp来理解CPU执行转移指令的基本原理。

2、 jmp指令

Jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。

Jmp指令要给出两种信息:

1. 转移的目的地址。

2. 转移的距离(段间转移、段内短转移、段内近转移)。

不同的给出目的地址的方法,和不同的转移位置,对应有不同格式的jmp指令,下面的几节内容中,我们以

给出目的地址的不同方法为主线,讲解jmp指令的主要应用格式和CPU执行转移指令的基本原理。

3、 依据位移进行转移的jmp指令

Jmp short 标号(转到标号处执行指令)。

这种格式的jmp指令,实现的是段内短转移,它对IP的修改范围为-128~127,也就是说,它向前转移时可以

最多越过128个字节,向后转移可以最多越过127个字节。Jmp指令中的“short”符号,说明指令进行的是短

转移,jmp指令中的“标号”是代码段中的标号,指明了指令要转移的目的地,转移指令执行结束后,CS:IP应该

指向标号处的指令。

请看下面一段代码:

Mov ax, 0

Jmp short s

Add ax, 1

  S:add ax, 2

最下面那条指令中的S就是标号,jmp short s指令执行后,CS:IP指向s:add ax, 2,上面那条指令add ax,

1已被跳过,没有被CPU执行。

在“jmp short 标号”指令所对应的机器码中,不包含转移的目的地址,而包含的是转移的位移,这个位移是

编译器根据汇编指令中的“标号”计算出来的,具体的计算方法如下图所示:

上图中,标号处的指令s0:inc bx的偏移地址为6,指令jmp s0后的第一个字节的偏移地址为3,位移量就是

6-3=3。

标号处的指令s:inc ax的偏移地址为0,指令jmp s下的第一个字节的偏移地址为9,位移量就是0-9=﹣9。

“Jmp short 标号”的功能为:IP=IP+8位位移:

1.8位位移=标号处的地址-jmp指令后的第一个字节的地址。

2.short指明此处的位移为8位位移。

3.8位位移的范围为﹣128~127,用补码表示(本教程不讲解补码,若你想了解,请看相关书籍)。

4.8位位移由编译程序在编译时算出。

还有一种和“jmp short 标号”功能相近的指令格式:“jmp near ptr 标号”,它实现的是段内近转移。

“jmp near ptr 标号”的功能为:IP=IP+16位位移。

1.16位位移=标号处的地址-jmp指令后的第一个字节的地址。

2.near ptr指明此处的位移为16位位移,进行的是段内近转移。

3.16位位移的范围为﹣32768~32767,用补码表示。

4.16位位移由编译程序在编译时算出。

上图中,标号处的指令s0:inc bx的偏移地址为6,指令jmp s0后的第一个字节的偏移地址为3,位移量就是
6-3=3。
标号处的指令s:inc ax的偏移地址为0,指令jmp s下的第一个字节的偏移地址为9,位移量就是0-9=﹣9。
“Jmp short 标号”的功能为:IP=IP+8位位移:
1.8位位移=标号处的地址-jmp指令后的第一个字节的地址。
2.short指明此处的位移为8位位移。
3.8位位移的范围为﹣128~127,用补码表示(本教程不讲解补码,若你想了解,请看相关书籍)。
4.8位位移由编译程序在编译时算出。
还有一种和“jmp short 标号”功能相近的指令格式:“jmp near ptr 标号”,它实现的是段内近转移。
“jmp near ptr 标号”的功能为:IP=IP+16位位移。
1.16位位移=标号处的地址-jmp指令后的第一个字节的地址。
2.near ptr指明此处的位移为16位位移,进行的是段内近转移。
3.16位位移的范围为﹣32768~32767,用补码表示。
4.16位位移由编译程序在编译时算出。

4、 转移地址在指令中或寄存器中的jmp指令

“Jmp far ptr 标号”实现的是段间转移(又称为远转移),功能如下:
CS=标号所在段的段地址,IP=标号在段中的偏移地址;
“Far ptr”指明了指令用标号的段地址和偏移地址修改CS和IP。
在“jmp far ptr 标号”指令所对应的机器码中,包含转移目的地的地址。
转移的目的地在寄存器中的jmp指令,指令格式为:
Jmp 16位通用寄存器。
功能:IP=16位通用寄存器
这种指令我们在前面的内容(参见2.6节)中已经讲过,这里就不再详述。

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

转移地址在内存中的jmp指令有两种格式:
1. “jmp word ptr 内存单元地址”(段内转移)。
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。内存单元地址可用寻址方式的任一格式
给出,比如,下面的指令:
Mov ax, 123H
Mov DS:[200], ax
Jmp word ptr DS:[200]
执行后,IP=123H
又比如,下面的指令:
Mov ax, 123H
Mov [bx], ax
Jmp word ptr [bx]
执行后,IP=123H
2. “jmp dword ptr 内存单元地址”(段间转移)。
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处的字是转移的目的
偏移地址。
CS=内存单元地址+2
IP=内存单元地址
内存单元地址可用寻址方式的任一格式给出。比如,下面的指令:
Mov ax, 123H
Mov DS:[200], ax
Mov word ptr DS:[202], 100
Jmp dword ptr DS:[200]
执行后,CS=100H,IP=123H,CS:IP指向100:123。
又比如,下面的指令:
Mov ax, 123H
Mov [bx], ax
Mov word ptr [bx+2], 100
Jmp dword ptr [bx]
执行后,CS=100H,IP=123H,CS:IP指向100:123。
在上面的指令中,我们接触到了一个新的符号“dword”,它表示什么意思呢?前面我们已学过,Byte表示字
节,word表示字,dword则表示双字。

6 、CALL指令

Call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP,它们经常被共同用来实现子程序的设
计。这两节,我们讲解call和ret指令的原理。
CPU执行call指令时,进行两步操作:1.将当前的IP或CS和IP压入栈中。2.转移。
Call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同,下面我们以给出转
移目的地址的不同方法为主线,讲解call指令的主要应用格式。
1. 依据位移进行转移的call指令。
Call 标号(将当前的IP压入栈后,转到标号处执行指令)。指令执行时,它的功能相当于:
Push IP
Jmp near ptr 标号
2. 转移地址在指令中的call指令。
Call far ptr 标号(实现的是段间转移)。
指令执行时,它的功能相当于:
Push CS
Push IP
Jmp far ptr 标号
3. 转移地址在寄存器中的call指令。
指令格式:call 16位通用寄存器
指令执行时,它的功能相当于:
Push IP
Jmp 16位通用寄存器
4. 转移地址在内存中的call指令。
这种call指令有两种格式:
格式1:call word ptr 内存单元地址
指令执行时,它的功能相当于:
Push IP
Jmp word ptr 内存单元地址
格式2:call dword ptr 内存单元地址
指令执行时,它的功能相当于:
Push CS
Push IP
Jmp dword ptr内存单元地址

7、 子程序

Ret指令用栈中的数据修改IP的数值,从而实现近转移。Ret指令执行时,进行下面两步操作:
1. IP=(SS×16+SP)中的数据
2. SP=SP+2
指令执行时,它的功能相当于:pop IP
学习了call和ret指令,现在来看一下,如何将它们配合使用来实现子程序的机制。请看下面的一段代码:
Mov ax, 1
Mov cx, 3
Call s
Mov bx, ax
Mov ax, 4c00H
Int 21H
S:add ax,ax
Loop s
Ret
我们来分析一下CPU执行这一段代码的过程。
1. CPU执行第一、第二条指令后,CS:IP指向call s。
2. CPU将call s指令的机器码读入,IP指向call s后的指令mov bx, ax。
3. 执行call s指令,将当前IP值(指令mov bx, ax的偏移地址)压入栈中,并将IP的值改变为标号s处的
偏移地址。
4. CPU从标号s处执行指令,直至loop指令循环完毕。
5. CPU指向并执行ret指令,从栈中弹出一个数据(即先前压入栈中的指令mov bx, ax的偏移地址)送入
IP,则CS:IP指向指令mov bx, ax。
6. CPU执行指令mov bx, ax,并向下继续执行,直到执行int 21H后,程序结束。
上面第3、第5项是重点,它揭示了子程序执行完之后,如何让CPU接着call指令向下执行。什么是子程序?
具有一定功能的程序段,我们称之为子程序。比如,上面的那一段代码,s:add ax, bx到ret那3条指令就是一个
简单的子程序,它的功能是把ax中的数值累加3次,累加次数放在cx中,用循环指令loop实现累加。
在需要的时候,我们用call指令转去执行它,执行完子程序后,要让CPU接着call指令向下执行,则需要用
到ret指令,call指令转去执行子程序之前,call指令后面的指令的地址将被存储在栈中,在子程序的后面使用ret
指令,用栈中的数据设置IP的值,从而转到call指令后面的代码处继续执行。
在上面那一段代码中,int 21H和loop这两条指令可能你看不懂,不过没关系,不影响讨论call和ret指令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高德地图开发2】---配置工程

1.从网站下载开发包并解压。 3D地图包解压后得到:3D地图显示包“Android_Map_2.x.x.jar ”和文件夹“ armeabi ”(以 V2.2.0为例,含 - libamapv302.so 和 libmapv302ex.so 文件)。2D地图包解压后得到:2D地图显示包“An…

antd option宽度自适应_建议收藏:Axure手机自适应教程

hello,我又来啦,今天和大家分享用axure怎么做自适应,也就是说,我们做app端的作品时,怎么在不同的手机尺寸,显示最佳的样式。那么这期的话,我会以一个游戏的案例来展开,所以比较好玩。…

安装pip

2019独角兽企业重金招聘Python工程师标准>>> linux系统安装pip: 1.下载get-pip.py wget https://bootstrap.pypa.io/get-pip.py 2.安装pip python get-pip.py windows系统安装pip,这里使用easy_install: 1.首先在命令行切换到easy_install.exe所在的Scri…

所以,路遥工具箱到底是什么东西?

笔者的软件开发生涯是从 2008 年开始的,彼时还是 2G 时代。站长之家是笔者当时经常访问的网站,站长工具也成为当时探索网络世界时的入门工具。软件开发这些年也是浑浑噩噩的度过,鲜有建树。2020 年之前也写了一些小工具用于解决一些注入字符串…

刷1000遍奥数题,不如学会这几道逻辑题,让孩子秒懂数学,学习早开窍!

▲ 点击查看前阵子发现一个英国BBC制作的纪录片,叫《逻辑的乐趣》(The Joy Of Logic),介绍了逻辑的概念,逻辑的发展史,及其在现实生活中的应用和价值。讲解非常有意思,深入浅出,风趣…

oracle技术之顺序文件上的索引(一)

顺序文件上的索引(一)研究索引结构,我们首先来考虑最简单的一种:由一个称为数据文件的排序文件得到另一个称为索引文件的文件,而这个索引文件由键-指针对组成。在索引文件中查找键K通过指针指向数据文件中查找键为K的记…

汇编语言之标志寄存器

1、标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3种作 用: 1. 用来存储相关指令的某些执行结果。 2. 用来为CPU执行相关指令提供行…

web网页的表单排版利器--960css

表单排版样式 960css 前言 一般web网页的表单排版,大家都习惯用table排版,自己需要根据实际需要去定义TR和TD,很多时候对于TD的高宽度、是否合并行,合并列,都要去做一些处理,这些都是比较繁琐的工作。找到一…

c语言将十进制转化为二进制算法_base64算法初探即逆向分析

算法分析虽说base64严格意义上来说并不能算是加密算法,但的确应用方面来说还算是比较广,在CTF的算法逆向中Base系列算是也比较常见的,萌新刚开始学算法,就以base64为例,对该算法进行一个简单的分析。简单来说&#xff…

新功能抢先看!Windows 11 2022 版全新 ISO 镜像来了+下载

面向 Dev 频道的 Windows 预览体验成员,微软现已发布 Windows 11 操作系统全新 ISO 镜像文件,此版本 ISO 镜像整合了自 Build 22449 至 Build 22533 的所有功能。文件名称:windows11_insiderpreview_client_x64_zh-cn_22533.iso 文件大小: 4.64 GB MD5:…

这是哪里来的小妖精!!!

1 或许小鸟依人就是怎么来的吧2 果然球体运动全靠弹。。3 小猫咪从爬猫架下来时的样子萌爆了....4 这猫也是很配合了~5 以后请不要说“有朝一日”,请说“下周五晚七点我请你吃火锅”,“三分钟后我给你打钱”,“现在我就喜欢你”。6 内容来源于…

汇编语言之常见的汇编指令

1、常见汇编指令 1. 传送指令(4个):mov、push、pop、lea。2. 转移指令(8个):call、jmp、je、jne、jb、jnb、ja、jna。3. 运算指令(7个):add、sub、mul、div、adc、sbb、c…

java list 初始化_Java新特性:数据类型可以扔掉了?

在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些: 枚举:尽管在 JDK 5 中增加了枚举类型,但是 Class 文件常量池的 CONSTANT_Class_info 类型常量并没有发生任何语义变化,仍然是代表一…

Kubernetes应用程序开发认证(CKAD) 经验分享

众所周知,Kubernetes在容器编排器大战中脱颖而出后,从2020年以来变得越发的火热。那么云原生计算基金会(CNCF)联合Linux基金会就适时的推出了皆在考察相关从业者对Kubernetes的运维和开发知识了解程度的认证考试,分别是…

【数据结构入门精讲 | 第十九篇】考研408、企业面试图专项练习(二)

在上一篇中我们进行了图的专项练习,在这一篇中我们重点探讨图的编程专项习题。 目录 R7-1 城市间紧急救援R7-2 地铁一日游R7-3 最小生成树的唯一性R7-4 网红点打卡攻略R7-5 畅通工程之最低成本建设问题R7-6 寻宝图R7-7 逆散列问题R7-8 任务调度的合理性R7-9 关键活动…

判断点在多边形内

2019独角兽企业重金招聘Python工程师标准>>> 0.前言 最近不断遇到类似的几何位置问题,一直没有花时间去总结,本文总结了我常用点跟多边形的位置判断方法以及代码。希望能够对大家有所帮助。 文中所指的多边形均为凸多边形,一些描…

Centos6.5使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践

Centos6.5安装Logstash ELK stack 日志管理系统概述:日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性&#…

k8s 手动恢复redis 集群_二进制手动部署k8s-1.14高可用集群(二、集群部署)

1. CA证书(任意节点)1.1 安装cfsslcfssl是非常好用的CA工具,我们用它来生成证书和秘钥文件 安装过程比较简单,如下:# 下载 $ mkdir -p ~/bin $ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O ~/bin/cfssl $ w…