汇编语言下的移位指令和串传送指令

embedded/2024/12/22 23:24:15/

移位指令

  1. SHL(Shift Left Logical):逻辑左移。
  2. SHR(Shift Right Logical):逻辑右移。
  3. SAL(Shift Arithmetic Left):算术左移(与SHL相同)。
  4. SAR(Shift Arithmetic Right):算术右移。
  5. ROL(Rotate Left):循环左移。
  6. ROR(Rotate Right):循环右移。
  7. RCL(Rotate through Carry Left):带进位的循环左移。
  8. RCR(Rotate through Carry Right):带进位的循环右移。

这些移位指令都是对二进制位进行移动

SHL/SAL(逻辑左移)

将位向左移动指定的次数,最右边空出的位填充0。

MOV AL, 01H ; AL = 0000 0001B
SHL AL, 1  ; AL = 0000 0010B,左移1位

SHR(逻辑右移)

将位向右移动指定的次数,最左边空出的位填充0。

MOV AL, 02H ; AL = 0000 0010B
SHR AL, 1  ; AL = 0000 0001B,右移1位

 

SAR(算术右移)

将位向右移动指定的次数,最左边空出的位用原来的最高位(符号位)填充。

MOV AL, 82H ; AL = 1000 0010B
SAR AL, 1  ; AL = 1000 0001B,右移1位,符号位填充

ROL(循环左移)

将位向左移动指定的次数,最左边移出的位被放到最右边。

MOV AL, 01H ; AL = 0000 0001B
ROL AL, 1  ; AL = 0001 0000B,左移1位,最左边的位被放到最右边

 

ROR(循环右移)

将位向右移动指定的次数,最右边移出的位被放到最左边。

MOV AL, 01H ; AL = 0000 0001B
ROR AL, 1  ; AL = 1000 0000B,右移1位,最右边的位被放到最左边

RCL(带进位的循环左移)

将位向左移动指定的次数,最左边移出的位被放到进位标志(CF)中,原来在CF中的位被放到最右边。

MOV AL, 03H ; AL = 0000 0011B
STC         ; 将CF设置为1
RCL AL, 1  ; AL = 0011 0100B,左移1位,CF的值被放到最右边,最左边的位被放到CF

 

RCR(带进位的循环右移)

将位向右移动指定的次数,最右边移出的位被放到进位标志(CF)中,原来在CF中的位被放到最左边。

MOV AL, 03H ; AL = 0000 0011B
STC         ; 将CF设置为1
RCR AL, 1  ; AL = 1100 0011B,右移1位,CF的值被放到最左边,最右边的位被放到CF

 

 串传送指令

MOVSB/MOVSW/MOVSD

这些指令用于在内存之间复制数据。MOVSB 传送一个字节,MOVSW 传送一个字(16位),MOVSD 传送一个双字(32位)。

; 假设DS:SI指向源字符串,ES:DI指向目的字符串
; CX寄存器包含要复制的字节数
CLD             ; 清除方向标志,确保SI和DI自增
REP MOVSB       ; 重复复制字节,直到CX为0

 

LODSB/LODSW/LODSD

这些指令用于从内存中加载数据到寄存器,并根据方向标志(DF)递增或递减SI/DI。

; 假设DS:SI指向源字符串
; AL/AX/EAX将存储加载的数据
CLD             ; 清除方向标志,确保SI自增
LODSB           ; 加载一个字节到AL,并递增SI
LODSW           ; 加载一个字到AX,并递增SI
LODSD           ; 加载一个双字到EAX,并递增SI

http://www.ppmy.cn/embedded/147929.html

相关文章

Java重要面试名词整理(一):性能调优

文章目录 MySQL篇联合索引最左前缀法则索引下推并发事务处理带来的问题事务隔离级别Read Uncommitted(读取未提交内容)Read Committed(读取提交内容 RC)Repeatable Read(可重读 RR)Serializable&#xff08…

Onvif服务端开发

实现了Onvif服务端的设备搜索和RTSP流的功能。用 ONVIF Device Manager 测试工具可以成功搜索到设备和获取到RTSP流,有的路由器可能不支持239.255.255.250组播,我一开始用的电信的那种光猫路由器二合一的,一直搜不到设备,后面用So…

PyTorch实现的猫狗图像分类项

猫狗图像分类项目 这是一个使用PyTorch实现的猫狗图像分类项目。 项目结构 model.py: 定义了CNN模型结构train.py: 训练模型的脚本predict.py: 使用训练好的模型进行预测requirements.txt: 项目依赖 环境配置 创建虚拟环境(推荐) python -m venv v…

C# 6.0 连接elasticsearch数据库

在 C# 6.0 中连接 Elasticsearch 数据库,您可以使用官方的 Elasticsearch 客户端库 NEST。NEST 是一个高性能的 .NET 客户端,用于与 Elasticsearch 进行交互。以下是一个详细的步骤指南,帮助您在 C# 6.0 项目中连接和操作 Elasticsearch。 1. 安装 NEST 包 首先,您需要在您…

Fgui世界坐标转ui坐标的问题

在做玩家与3d物体交互的时候遇到一个问题,就是3d物体的世界坐标转换成Fgui的UI坐标,会有一点问题,在fgui的官方文档中是这么描述一个3d物体的世界坐标转换为fgui的ui坐标是这么描述的 这个应该是一个比较普遍的方案,在我的实际项目…

【线性代数】理解矩阵乘法的意义(点乘)

刚接触线性代数时,很不理解矩阵乘法的计算规则,为什么规则定义的看起来那么有规律却又莫名其妙,现在参考了一些资料,回过头重新总结下个人对矩阵乘法的理解(严格来说是点乘)。 理解矩阵和矩阵的乘法&#x…

siglip代码笔记

Github siglip-so400m-patch14-384 使用了SoViT-400m结构,SoViT :a shape-optimized vision transformer,结构参数经过试验测试得到。具体见 Getting ViT in Shape: Scaling Laws for Compute-Optimal Model Design We validate these predic…

MFC/C++学习系列之简单记录11——树控件的使用

MFC/C学习系列之简单记录11——树控件的使用 前言CTreectrl使用界面设置代码使用简单设计其他使用注意! 总结 前言 在之前的界面设计中使用得很少,但是可以学习一下,以备不时之需! CTreectrl使用 界面设置 在工具箱中选择Tree C…