微机原理实验三、将AX寄存器中的16位数分成4组,每组4位,让后把这四组数分别放在AL,BL,CL,DL

微机原理实验三、将AX寄存器中的16位数分成4组,每组4位,让后把这四组数分别放在AL,BL,CL,DL

功能: 将AX寄存器中的16位数分成4组,每组4位,让后把这四组数分别放在AL,BL,CL,DL
; 调试结果:
input:AX <-- 1234H
output: AL <-- 1H BL <–2H CL <–3H DL <–4H

一、 SHR 逻辑右移指令

SHR 是 x86 汇编中的逻辑右移指令,用于将一个寄存器或内存位置的二进制数向右移动指定的位数,并将移出的位保存到进位标志位(CF)中

语法为:

SHR destination, count
  • destination:要进行右移的操作数,可以是寄存器或内存位置。
  • count:要右移的位数,可以是立即数或者存放着位数的寄存器。

执行 SHR AH, CL 指令后,AH 寄存器中的内容向右移动 CL 寄存器中的值,移出的位被保存到进位标志位(CF)中。

1.1 误区:MOV BL, CF

注意!!有一个坑
虽然前面有说过将移出的位保存到进位标志位(CF)中但是…

CF(Carry Flag,进位标志位)是一个单独的标志位寄存器,用于标记算术操作中的进位。SHR 指令将 AH 寄存器中的内容右移指定的位数,并将被移出的位(即最右边的位)存储在 CF 中。但是,MOV 指令无法直接将 CF 寄存器中的值移动到另一个寄存器中。

因此,无法通过MOV BL, CF来实现将 CF 中的值直接移动到 BL 寄存器中。要使用 CF 中的值,您需要先将其与其他寄存器或数据进行操作,然后将结果存储到 BL 寄存器中。

例如,您可以通过以下方式使用 CF 寄存器中的值:

; 假设您已经执行了 SHR AH, CL 指令,CF 中存储了移出的位

; 判断 CF 是否为 1(表示有进位)
CMP CF, 1
JE has_carry ; 如果 CF 为 1,则跳转到有进位的处理过程

; CF 为 0,没有进位的处理过程
...

has_carry:
; CF 为 1,有进位的处理过程
...

或者,您可以将 CF 寄存器中的值与其他数据进行逻辑或算术运算,然后将结果存储到 BL 寄存器中。

二、 实现将16位数分为四组的逻辑

    MOV AX, num         ; 将 num 的值加载到 AX 寄存器中,待分组的数
    MOV CL,4            ; 将要右移的位数加载到 CL 寄存器中,右移 4 位,即分组为高 4 位和低 4 位
    MOV BX,AX           ; 将 AX 寄存器的值复制到 BX 寄存器中
    MOV DX,AX           ; 将 AX 寄存器的值复制到 DX 寄存器中,ax 值先保存至寄存器中

    ; AL 存放 AH 中的高 4 位,右移
    SHR AH,CL
    MOV AL,AH

    ; BL 存放 AH 中的低 4 位,与操作
    AND BH,0FH
    MOV BL,BH

    MOV DH,DL           ; 准备给 CL
    ; DL 存放 AL 中低 4 位,与操作
    AND DL,0FH
    ; CL 存放 AL 中高 4 位,右移
    SHR DH,CL
    MOV CL,DH
  1. MOV AX, num:将双字寄存器 num 中的值加载到 AX 寄存器中,以备后续的操作。

  2. MOV CL,4:将要进行的位移数(4)加载到 CL 寄存器中,因为我们想要将双字寄存器的值分为高低两部分,每部分各占 4 位。

  3. MOV BX,AXMOV DX,AX:这两行将 AX 寄存器的值分别复制到 BX 寄存器和 DX 寄存器中,以便稍后的操作。这是为了保存 AX 寄存器的值,因为我们要对它进行修改。

  4. SHR AH,CL:将 AH 寄存器中的值向右移动 CL 次,即将 AX 中的高 4 位移到 AH 中。这样就完成了高低位的分组。

  5. MOV AL,AH:将 AH 寄存器中的值移动到 AL 寄存器中,这样 AL 中就存储了原始值的高 4 位。

  6. AND BH,0FH:将 BH 寄存器中的值与 0FH(00001111B)进行按位与操作,这样就只保留了低 4 位的值,将其他位清零。

  7. MOV BL,BH:将 BH 寄存器中的值移动到 BL 寄存器中,这样 BL 中就存储了原始值的低 4 位。

  8. MOV DH,DL:将 DL 寄存器中的值移动到 DH 寄存器中,这是为了备份 DL 寄存器中的值,因为接下来要对 DL 进行操作。

  9. AND DL,0FH:将 DL 寄存器中的值与 0FH 进行按位与操作,这样就只保留了 AL 中的低 4 位的值,将其他位清零。

  10. SHR DH,CL:将 DH 寄存器中的值向右移动 CL 次,即将 AL 中的高 4 位移到 DH 中。这样就完成了对原始值的高 4 位的处理。

  11. MOV CL,DH:将 DH 寄存器中的值移动到 CL 寄存器中,这样 CL 中就存储了原始值的高 4 位。

三、实现程序完整代码(结果未打印)

下面程序的结果没有打印出来,但是可以通过调试的手段看到各寄存器的值

DATAS SEGMENT
    ; 此处输入数据段代码
    num DW 0H           ; 用于存放待分组的数

DATAS ENDS

STACKS SEGMENT
    ; 此处输入堆栈段代码

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:
    MOV AX,DATAS        ; 将数据段的段地址加载到 AX 寄存器中
    MOV DS,AX           ; 将 AX 寄存器中的数据段地址设置到 DS 寄存器,以便程序能够访问数据段中的数据
    
    MOV AX, num         ; 将 num 的值加载到 AX 寄存器中,待分组的数
    MOV CL,4            ; 将要右移的位数加载到 CL 寄存器中,右移 4 位,即分组为高 4 位和低 4 位
    MOV BX,AX           ; 将 AX 寄存器的值复制到 BX 寄存器中
    MOV DX,AX           ; 将 AX 寄存器的值复制到 DX 寄存器中,ax 值先保存至寄存器中

    ; AL 存放 AH 中的高 4 位,右移
    SHR AH,CL
    MOV AL,AH

    ; BL 存放 AH 中的低 4 位,与操作
    AND BH,0FH
    MOV BL,BH

    MOV DH,DL           ; 准备给 CL
    ; DL 存放 AL 中低 4 位,与操作
    AND DL,0FH
    ; CL 存放 AL 中高 4 位,右移
    SHR DH,CL
    MOV CL,DH

    MOV AH,4CH          ; DOS 功能号,表示"程序终止"
    INT 21H             ; 终止程序的执行

CODES ENDS

END START

四、使用串口打印出各寄存器的值

实现效果:
在这里插入图片描述

;#########################################################################
; @Description: 将AX寄存器中的16位数分成4组,
;               每组4位,让后把这四组数分别放在AL,BL,CL,DL
;* @Version: 1.0
;* @Autor: Huining Li777
;* @input:  num DW 4444H 
;* @output:
;       AL: 4
;       BL: 4
;       CL: 4
;       DL: 4
;#########################################################################

DATAS SEGMENT
    ; 此处输入数据段代码
    num DW 4444H           ; 用于存放待分组的数
    outputAL    DB 'AL: $' ; 输入提示文字
    outputBL    DB 'BL: $' ; 输入提示文字
    outputCL    DB 'CL: $' ; 输入提示文字
    outputDL    DB 'DL: $' ; 输入提示文字
    newline     DB 13, 10, '$' ; 换行符
DATAS ENDS

STACKS SEGMENT
    ; 此处输入堆栈段代码

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:
    MOV AX,DATAS        ; 将数据段的段地址加载到 AX 寄存器中
    MOV DS,AX           ; 将 AX 寄存器中的数据段地址设置到 DS 寄存器,以便程序能够访问数据段中的数据

    MOV AX, num         ; 将 num 的值加载到 AX 寄存器中,待分组的数
    MOV CL,4            ; 将要右移的位数加载到 CL 寄存器中,右移 4 位,即分组为高 4 位和低 4 位
    MOV BX,AX           ; 将 AX 寄存器的值复制到 BX 寄存器中
    MOV DX,AX           ; 将 AX 寄存器的值复制到 DX 寄存器中,ax 值先保存至寄存器中

    ; AL 存放 AH 中的高 4 位,右移
    SHR AH,CL
    MOV AL,AH

    ; BL 存放 AH 中的低 4 位,与操作
    AND BH,0FH
    MOV BL,BH

    MOV DH,DL           ; 准备给 CL
    ; DL 存放 AL 中低 4 位,与操作
    AND DL,0FH
    ; CL 存放 AL 中高 4 位,右移
    SHR DH,CL
    MOV CL,DH

    MOV BH,DL           ; 保存 DL 中低 4 位,用于输出

    ; 输出 AL、BL、CL、DH 的值
    ;MOV AH, 09H         ; DOS 功能号,表示"输出字符串"

    MOV DX, OFFSET outputAL  ; 设置DX为输出字符串的地址
    MOV AH, 09H              ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出字符串到控制台

    MOV DL, AL          ; 将 AL 寄存器的值传递给 DL 以便输出
    ADD DL, '0'         ; 将数字转换为对应的 ASCII 码
    MOV AH, 02H         ; 设置 DOS 功能号为 "输出字符"
    INT 21H             ; 输出字符到控制台

    MOV DX, OFFSET newline ; 设置DX为换行符的地址
    MOV AH, 09H            ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出换行符到控制台

    MOV DX, OFFSET outputBL  ; 设置DX为输出字符串的地址
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出字符串到控制台

    MOV DL, BL          ; 将 BL 寄存器的值传递给 DL 以便输出
    ADD DL, '0'         ; 将数字转换为对应的 ASCII 码
    MOV AH, 02H         ; 设置 DOS 功能号为 "输出字符"
    INT 21H             ; 输出字符到控制台

    MOV DX, OFFSET newline ; 设置DX为换行符的地址
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出换行符到控制台

    MOV DX, OFFSET outputCL  ; 设置DX为输出字符串的地址
    INT 21H             ; 输出字符串到控制台

    MOV DL, CL          ; 将 CL 寄存器的值传递给 DL 以便输出
    ADD DL, '0'         ; 将数字转换为对应的 ASCII 码
    MOV AH, 02H         ; 设置 DOS 功能号为 "输出字符"
    INT 21H             ; 输出字符到控制台

    MOV DX, OFFSET newline ; 设置DX为换行符的地址
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出换行符到控制台

    MOV DX, OFFSET outputDL  ; 设置DX为输出字符串的地址
    INT 21H             ; 输出字符串到控制台

    MOV DL, BH          ; 将 BH 寄存器的值传递给 DL 以便输出
    ADD DL, '0'         ; 将数字转换为对应的 ASCII 码
    MOV AH, 02H         ; 设置 DOS 功能号为 "输出字符"
    INT 21H             ; 输出字符到控制台

    MOV AH,4CH          ; DOS 功能号,表示"程序终止"
    INT 21H             ; 终止程序的执行

CODES ENDS

END START

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET集成客户关系管理的企业网站的设计与开发

摘 要 企业要在激烈的市场竞争中立于不败之地&#xff0c;就必须找一种全新的管理理念和管理手段&#xff0c;对其内部和外部资源进行有效的整合。新一代ERP产品正在向客户端和供应端延伸&#xff0c;客户端的延伸即是客户关系管理。对于每个企业来说客户管理的完善程度将直接…

计算机网络 --- WebSocket协议 和 Signalr

计算机网络 --- WebSocket协议 和 Signalr 什么是WebSocket什么是SignalrSignalr Example -- SimpleChat 什么是WebSocket HTTP是基于TCP协议的&#xff0c;同一时间里&#xff0c;客户端和服务器只能有一方主动发数据&#xff0c;是半双工通信。 通常&#xff0c;打开某个网页…

Qt笔记-解决子控制大小获取不正确(width和height)需要重制窗体后,才能获得正确的值

在Qt中&#xff0c;子控件的宽度和高度在构造后并不准确&#xff0c;而只有在调整窗口大小后才正确&#xff0c;这可能是因为子控件的布局或者约束尚未完全计算和应用。 为了解决这个问题&#xff0c;可以使用QTimer来延迟获取子控件的宽度和高度&#xff0c;以确保在布局和约…

ffmpeg初体验

一&#xff1a;安装 sudo yum install epel-release -y sudo yum update -ysudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpmyum -y install …

数据结构(邓俊辉)学习笔记——向量vector_02_动态空间管理

文章目录 1. 概述2. 静态空间管理缺点3. 动态空间管理3.1 扩容3.1.1 如何实现扩容3.1.2 扩容算法3.1.3 容量递增策略 VS 容量倍增策略3.1.3.1 容量倍增策略分摊分析3.1.3.2 容量递增策略分摊分析3.1.3.3 结果对比 3.2缩容3.2.1 动态缩容算法实现3.2.2 动态缩容算法时间复杂度 4…

Opencv_3_图像对象的创建与赋值

ColorInvert.h 如下&#xff1a; #include <opencv.hpp> using namespace std; #include <opencv.hpp> using namespace cv; using namespace std; class ColorInvert{ public : void mat_creation(); }; ColorInvert.cpp 文件如下&#xff1a; #include &q…

自动驾驶---OpenSpace之Hybrid A*规划算法

1 背景 笔者在上周发布的博客《自动驾驶---低速场景之记忆泊车》中&#xff0c;大体介绍了记忆泊车中的整体方案&#xff0c;其中详细阐述了planning模块的内容&#xff0c;全局规划及局部规划&#xff08;会车&#xff09;等内容&#xff0c;包括使用的算法&#xff0c;但是没…

3D Gaussian Splatting介绍

目录 一、概述二、基础介绍1. 多维高斯分布2. 将3D 高斯投影到2D像素平面3. 球谐函数4. Splatting and α \alpha α blending 三、整体流程四、 伪代码五、评价指标六、实验结果七、reference 一、概述 3D Gaussian Splatting和NeRF一样&#xff0c;主要用于新视图合成。 特…

开源博客项目Blog .NET Core源码学习(17:App.Hosting项目结构分析-5)

本文学习并分析App.Hosting项目中前台页面的作品展示页面和首页页面。 作品展示页面 作品展示页面总体上为上下布局&#xff0c;上方显示导航菜单&#xff0c;下方从左向右显示图片数据&#xff0c;支持放大查看图片和下载图片。整个页面使用了layui中的面包屑导航、弹出层、流…

高通发布电脑CPU,比英特尔Ultra9领先51%

要说2024年最热门的关键词&#xff0c;那肯定非 AI 莫属&#xff0c;当前 AI 已经开始深入各行各业&#xff0c;AI 电视、AI 手机、AI 车机、AI 家电&#xff0c;以及 AI PC ,这些都意味着 AI 将对各个行业带来的新风向和不小的冲击。 2024 年了&#xff0c;PC 处理器还能卷出什…

偏微分方程算法之二阶双曲型方程紧差分方法

目录 一、研究目标 二、理论推导 三、算例实现 一、研究目标 前面我们已经介绍了二阶双曲型方程显式、隐式差分格式&#xff0c;可否像抛物型方程一样&#xff0c;构建更高精度的差分格式。接下来我们介绍紧差分格式。这里继续以非齐次二阶双曲型偏微分方程的初边值问题为研…

【JavaScriptThreejs】判断路径在二维平面上投影的方向顺逆时针

原理分析 可以将路径每个连续的两点向量叉乘相加&#xff0c;根据正负性判断路径顺逆时针性 当我们计算两个向量的叉积时&#xff0c;结果是一个新的向量&#xff0c;其方向垂直于这两个向量所在的平面&#xff0c;并且其大小与这两个向量构成的平行四边形的面积成正比。这个新…

Elasticsearch:崭新的打分机制 - Learning To Rank (LTR)

警告&#xff1a;“学习排名 (Learning To Rank)” 功能处于技术预览版&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但此功能不受官方 GA 功能的支持 SLA 的约束。 注意&#xff1a;此功能是在版本 8.12.0 中引入的&#xff0c;并且仅适…

【云计算】云数据中心网络(七):负载均衡

《云网络》系列&#xff0c;共包含以下文章&#xff1a; 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络&#xff08;一&#xff09;&#xff1a;VPC云数据中心网络&#xff08;二&#xff09;&#xff1a;弹性公网 IP云数据中心网络&#xff08;三&#xff09;…

防火墙如何工作

防火墙是网络安全的重要组成部分&#xff0c;充当受信任的内部网络与外部世界之间的保护屏障。它根据预定的安全规则监视和控制传入和传出的网络流量。您是否知道防火墙的概念可以追溯到 20 世纪 80 年代&#xff0c;当时互联网还处于早期阶段&#xff1f;从那时起&#xff0c;…

SpringBoot项目启动的时候直接退出了?

SpringBoot项目启动的时候直接退出了&#xff1f; 如下图&#xff1a; 在启动SpringBoot项目的时候仅仅用了1.209s&#xff0c;然后直接退出了&#xff0c;也没有出现启动的项目对应的服务器端口号&#xff1f;为什么会这样呢&#xff1f;因为既然有服务器端口号 那么肯定会有…

linux系统是未来_大小写敏感_case_sensitive_编程原生态

修改 py 文件 &#x1f94a; 回忆上次内容 上次尝试了 两个vim 同时打开 同一py文件 vim出现了Error 有各种选择 错误拼写 pront 导致 运行时 出现了NameError 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 错误(Error) 不是 我们 无能的标记 …

k8s pod使用sriov

之前的文章中讲了k8s multus的使用&#xff0c;本章节来讲述下如何使用multus来实现sriov的使用。 一、sriov 简介 SR-IOV在2010年左右由Intel提出&#xff0c;但是随着容器技术的推广&#xff0c;intel官方也给出了SR-IOV技术在容器中使用的开源组件&#xff0c;例如&#…

力扣(leetcode) 407. 接雨水 II 3D接雨水

力扣(leetcode) 407. 接雨水 II 3D接雨水 给你一个 m x n 的矩阵&#xff0c;其中的值均为非负整数&#xff0c;代表二维高度图每个单元的高度&#xff0c;请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输…

Excel vlookup函数的使用教程 和 可能遇到的错误解决方法

使用VLOOKUP示例 被查询的表格 表一 A列B列C列A1aB2bC3c 要匹配的列 表二 F列G列H列ACBDA 要G列匹配字母&#xff0c;H列匹配数字 G 使用公式VLOOKUP(F5,A:D,3,0) 参数说明 F5 是表二 F列第五行的A A:D表是要匹配的数据列表在A到D列&#xff0c;就是表一 &#xff08;注意…