X86架构(六)——移位指令与无条件转移指令

2024-09-03 23:28

本文主要是介绍X86架构(六)——移位指令与无条件转移指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

移位指令

  • shr
    逻辑右移
    逻辑右移指令会将操作数连续地向右移动指定的次数,移出的比特被移到标志寄存器的CF位,左边空出来的位置用0填充
    逻辑右移示意图
;目的操作数可以是8位或16位的通用寄存器或者内存单元
;源操作数可以是数字18位立即数或者寄存器CL
shr r/m8, 1		;目的操作数是8位通用寄存器/内存单元,源操作数是1
shr ah, 1
shr r/m16, 1	;目的操作数是16位通用寄存器/内存单元,源操作数是1
shr ax, 1
shr r/m8, imm8	;目的操作数是8位通用寄存器/内存单元,源操作数是8位立即数
shr al, 0x20
shr r/m16, imm8	;目的操作数是16位通用寄存器/内存单元,源操作数是8位立即数
shr ax, 0x02
shr r/m8, cl	;目的操作数是8位通用寄存器/内存单元,源操作数是寄存器CL
shr al, cl
shr r/m16, cl	;目的操作数是16位通用寄存器/内存单元,源操作数是寄存器CL
shr word [bx], cl
  • shl
    逻辑左移指令
    该指令与shr指令的格式一致,只不过是向左移动
shl dx, 12
  • ror
    循环右移指令
    循环右移指令将目的操作数移出的比特送到标志寄存器的CF位,同时将其送进左边空出的位
    循环右移
    NOTE 该指令与shr格式相同,在此不再赘述
  • rol
    循环左移
    循环左移指令将目的操作数移出的比特送到标志寄存器的CF位,同时将其送进右边空出的位
    NOTE 该指令与shr格式相同,在此不再赘述

8086无条件转移指令

  1. 相对短转移
    该类转移的操作数是相对于目标位置的偏移量,仅1字节,是个有符号数(-128~127)
    该指令属于段内转移指令,只允许转移到距离当前指令-128~127 字节的地方
jmp short __xxx	;__xxx为标号
;编译阶段,编译器会检查标号`__xxx`所代表的值,如果数值超过了一字节所能允许的数值范围
;则无法通过编译
;相对短转移指令的汇编语言操作数只能是标号和数值
jmp short 0x2000
;数值和标号是等价的。在编译阶段,都被用来计算一个8位的偏移量
;在指令执行时,处理器把指令中的操作数加上2,再加到指令指针寄存器IP
  1. 16位相对近转移
    16位相对近转移指令后跟16位(2 字节)的操作数
    相对的意思是指它的操作数是一个相对量,是相对于目标位置处的偏移量
    在源程序编译阶段,编译器用目标位置的汇编地址减去当前指令的汇编地址,再减去当前指令的长度(3),保留16 位的结果,作为机器指令的操作数。这是一个16 位的有符号数,故可以转移到距离当前指令-32768~32767 字节的地方
jmp near __xxx
jmp near 0x3000
  1. 16位间接绝对近转移
    这种转移方式也是近转移,转移到的目标偏移地址不是在指令中直接给出的,而是用一个16位的通用寄存器或者内存地址来间接给出
jmp near bx
jmp near cx
;near 可省略
;处理器将用寄存器BX或者CX的内容来取代指令指针寄存器IP的当前内容
jmp [jmp_dest]	;jmp_dest是转移目标的起始偏移地址[ds:jmp_dest]
  1. 16位直接绝对远转移
jmp 0x0000:0x7c00 ;0x0000是段地址,0x7c00是偏移地址
;执行这条指令后,处理器用指令中给出的段地址代替段寄存器CS的原有内容
;用给出的偏移地址代替IP寄存器的内容
  1. 16位间接绝对远转移(jmp far)
    远转移的目标地址通过访问内存来间接得到,要使用关键字far
;标号jump_far其后初始化的字分别对应程序片段的`偏移地址和段地址`
jump_far dw 0x33c0, 0xf000
;从指令中给出的偏移地址处取出两个字,分别用来替代段寄存器CS和指令指针寄存器IP的内容
jmp far [jump_far]

这篇关于X86架构(六)——移位指令与无条件转移指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134345

相关文章

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

PyCharm如何从C盘转移到D盘

《PyCharm如何从C盘转移到D盘》:本文主要介绍PyCharm如何从C盘转移到D盘的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm从C盘转移到D盘找到在C盘的pycharm,复制整个文件夹到D盘指定位置创建新的快捷方式转移C盘中Pych

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

Nacos客户端本地缓存和故障转移方式

《Nacos客户端本地缓存和故障转移方式》Nacos客户端在从Server获得服务时,若出现故障,会通过ServiceInfoHolder和FailoverReactor进行故障转移,ServiceI... 目录1. ServiceInfoHolder本地缓存目录2. FailoverReactorinit