【汇编语言】转移指令的原理(三) —— 汇编跳转指南:jcxz、loop与位移的深度解读

news2024/11/23 16:43:24

在这里插入图片描述

文章目录

  • 前言
  • 1. jcxz 指令
    • 1.1 什么是jcxz指令
    • 1.2 如何操作
  • 2. loop 指令
    • 2.1 什么是loop指令
    • 2.2 如何操作
  • 3. 根据位移进行转移的意义
    • 3.1 为什么?
    • 3.2 举例说明
  • 4. 编译器对转移位移超界的检测
  • 结语

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

1. jcxz 指令

1.1 什么是jcxz指令

jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。

对IP的修改范围都为-128~127。

指令格式:jcxz 标号(如果(cx)=0,则转移到标号处执行。)

1.2 如何操作

"jcxz 标号"指令操作:

  • 当(cx)=0时,(IP)=(IP)+8位位移;

  • 8位位移=“标号”处的地址 - jcxz指令后的第一个字节的地址;

  • 8位位移的范围为-128~127,用补码表示;

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

  • 当(cx)=0时,什么也不做(程序向下执行)。

我们从 jcxz的功能中可以看出,指令“jcxz 标号”的功能相当于:

if((cx)==0) jmp short 标号;
(这种用C语言和汇编语言进行的综合描述,或许能使你对有条件指令理解得更加清楚。)

2. loop 指令

2.1 什么是loop指令

loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。

对IP的修改范围都为-128~127。

指令格式:loop 标号((cx))=(cx)-1,如果(cx)≠0,转移到标号处执行。)

2.2 如何操作

"loop 标号"指令操作:

(1)(cx)=(cx)-1;

(2)如果(cx)≠0,(IP)=(IP)+8位位移。

  • 8位位移=“标号”处的地址-loop指令后的第一个字节的地址;

  • 8位位移的范围为-128~127,用补码表示;

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

  • 当(cx)=0,什么也不做(程序向下执行)。

我们从loop的功能中可以看出,指令“loop 标号”的功能相当于:
(cx)–;
if((cx)≠0) jmp short 标号;

3. 根据位移进行转移的意义

3.1 为什么?

前面我们讲到:

jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号

等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。

在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。

这样设计,方便了程序段在内存中的浮动装配

3.2 举例说明

例如:

在这里插入图片描述

这段程序装在内存中的不同位置都可正确执行,因为 loop s 在执行时只涉及到s的位移( - 4,前移 4个字节,补码表示为FCH),而不是s的地址。

如果loop s的机器码中包含的是s的地址,则就对程序段在内存中的偏移地址有了严格的限制;因为机器码中包含的是 s 的地址,如果 s 处的指令不在目的地址处,程序的执行就会出错。

而loop s的机器码中包含的是转移的位移,就不存在这个问题了;因为,无论 s 处的指令的实际地址是多少,loop指令的转移位移是不变的

4. 编译器对转移位移超界的检测

注意,根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。

比如,下面的程序将引起编译错误:

assume cs:code

code segment
start:	jmp short s
	db  128 dup(0)
    s:	mov ax,0ffffh
code ends

end start

报错如下:
在这里插入图片描述

jmp shorts的转移范围是-128~127,IP最多向后移动127 个字节,

我们在前面的文章中讲到的形如“jmp 2000:0100”的转移指令,是在 Debug 中使用的汇编指令,汇编编译器并不认识。如果在源程序中使用,编译时也会报错。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

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

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

相关文章

django启动项目报错解决办法

在启动此项目报错: 类似于: django.core.exceptions.ImproperlyConfigured: Requested setting EMOJI_IMG_TAG, but settings are not c启动方式选择django方式启动,以普通python方式启动会报错 2. 这句话提供了对遇到的错误的一个重要线索…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中,我们通常会将某些常见组件进行二次封装,以便更好地实现特定的业务需求。然而,在封装 Table 组件时,遇到一个问题:Table 内部暴露的方法,在封装之后的组件获取不到。 代码展示为: …

项目-摄像

树莓派摄像头使用方法 Camera教程 https://www.raspi.cc/index.php?cread&id53&page1 nanopc-t4 ​https://www.raspi.cc/index.php?cread&id53&page1 摄像头型号 Raspberry Pi Camera Rev 1.3 检测故障 dmesg | grep -i mipi piNanoPC-T4:~$ dmesg | …

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…

解决python import ddddocr报错DLL load failed while...的办法

目录 1. DLL1.1 DLL是什么1.2 为什么会出现这个 2. 如何解决2.1 安装Microsoft Visual C Redistributable推荐</sup>2.2 安装或更新onnxruntime库2.3 检查环境变量 在Python中导入ddddocr模块的时候遇到“DLL load failed”错误, 所以记录一下解决过程。 1. DLL 1.1 DL…

All-in-one Notion 介绍

Notion 是一款集笔记、知识管理、任务规划和协作于一体的工具&#xff0c;它以高度的灵活性和可自定义的工作空间而闻名。它适合个人和团队使用&#xff0c;能够帮助用户高效管理生活、学习和工作。以下是 Notion 的一些主要特点&#xff1a; 1. 多功能工作区 Notion 将笔记、…

Linux-第2集-打包压缩 zip、tar WindowsLinux互传

欢迎来到Linux第2集&#xff0c;这一集我会非常详细的说明如何在Linux上进行打包压缩操作&#xff0c;以及解压解包 还有最最重要的压缩包的网络传输 毕竟打包压缩不是目的&#xff0c;把文件最终传到指定位置才是目的 由于打包压缩分开讲没有意义&#xff0c;并且它们俩本来…

Unity脚本基础规则

Unity脚本基础规则 如何在Unity中创建一个脚本文件&#xff1f; 在Project窗口中的Assets目录下&#xff0c;选择合适的文件夹&#xff0c;右键&#xff0c;选择第一个Create&#xff0c;在新出现的一栏中选择C# Script&#xff0c;此时文件夹内会出现C#脚本图标&#xff0c;…

[Qt platform plugin问题] Could not load the Qt platform plugin “xcb“

Qt platform plugin 是 Qt 应用程序启动时加载的插件。不同的平台有不同的插件。 常见的插件有:linuxfb Wayland xcb 简单来说就是启动一个GUI程序, 离不开这些插件.选择其中一个就好 出现这个问题要么就是没有插件&#xff0c;要么就是插件依赖的库没有。 要么就是插件选则的…

MySql 索引视图存储变量

要求 一&#xff1a; 学生表:Student(Sno&#xff0c;Sname&#xff0c;Ssex &#xff0c;Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表:Course(Cno&#xff0c;Cname) 课程号&#xff0c;课程名 Cno为主键 学生…

高阶云服务-ELB+AS

ELBAS 弹性负载均衡弹性伸缩 原来1台web服务器不满足相应&#xff0c;现部署多台提供相同服务&#xff1b; 由于多个服务器多个ip该如何提供给应用呢&#xff1f; 引申出负载均衡&#xff08;HAProxy&#xff0c;LVS01四层&#xff0c;Nginx七层&#xff09; 防单点故障做主备…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…

SpringBoot 集成 Sharding-JDBC(一):数据分片

在深入探讨 Sharding-JDBC 之前&#xff0c;建议读者先了解数据库分库分表的基本概念和应用场景。如果您还没有阅读过相关的内容&#xff0c;可以先阅读我们之前的文章&#xff1a; 关系型数据库海量数据存储策略-CSDN博客 这篇文章将帮助您更好地理解分库分表的基本原理和实现…

芋道启用undertown

芋道使用的是tomcat, 可以替换为性能更好的undertown 1.maven配置 1.1在yudao-dependencies模块下yudao-spring-boot-starter-web 和yudao-spring-boot-starter-websocket排除spring-boot-starter-tomcat 添加 <exclusions><exclusion><groupId>org.spring…

(Linux 入门) 基本指令、基本权限

目录 一、什么是操作系统 二、基础指令 01. ls 指令 02. pwd命令 03.mkdir 04. touch指令 05.rmdir指令 && rm 指令 06.man指令&#xff08;重要&#xff09; 07 cat 08.cp指令 09 mv指令 10 alias 指令 11.more指令 12.head指令 13.less指令 14.时间相…

贴代码框架PasteForm特性介绍之select,selects,lselect和reload

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

【AI+教育】一些记录@2024.11.16

《万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题》 万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题关于 ChatGPT 铺天盖地的信息让人无所适从。本文则试图提炼出五个关键问题&#xff1a;如何理解这次范式突破&#xff0c;未来能达到的技术天花板&#xff0c;行…

基于vue框架的的图书在线销售系统设计2503xPC端(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,图书分类,图书信息,入库信息 开题报告内容 基于Vue框架的图书在线销售系统设计开题报告 一、研究背景与意义 随着互联网技术的不断发展和普及&#xff0c;电子商务已成为现代商业的重要组成部分。图书作为知识和文化的载体&#…

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中&#xff0c;任务栈&#xff08;Task&#xff09;是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

Android15之解决:Dex checksum does not match for dex:framework.jar问题(二百三十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…