汇编语言学习(二)——寄存器

article/2025/7/1 12:47:10

目录

一、通用寄存器

二、数据存储

三、汇编指令

四、物理地址

五 、段寄存器

一、通用寄存器

        在8086 CPU中,通用寄存器共有四个,分别是 AX、BX、CX 和 DX,它们通常用于存放一般性的数据,均为 16 位寄存器,可以存储两个字节的数据。

        1、AX :常用于数据中转和算术运算。它还可以作为累加器(Accumulator),在乘法、除法等操作中发挥重要作用。          

        2、BX:通常用作基址寄存器,用于间接寻址,即在内存地址中作为偏移量的一部分。

        3、CX:通常用作计数器寄存器(Count Register),在循环操作和字符串操作中非常有用。

        4、DX:通常用作数据寄存器,用于存储数据或 I/O 端口地址。

通用寄存器AXBXCXDX
用途

1.输入/输出操作(如 I/O 指令);

2.用于乘法和除法操作;

3.作为默认的寄存器用于数据传递和运算;

1.用于存储偏移地址,配合段寄存器(如 DS)形成完整的内存地址;

2.用于数组访问和间接寻址;

1.用于循环指令(如 LOOP)的计数;

2.用于字符串操作中的重复操作(如 REP);

1.用于存储 I/O 端口地址,例如在 IN 和 OUT 指令中;

2.用于乘法和除法操作,与 AX 配合使用

细化AH、ALBH、BLCH、CLDH、DL

        通用寄存器均可分为两个独立的8位寄存器使用;

        AH/BH/CH/DH:用于存放高8位地址;

        AL/BL/CL/DL:用于存放低8位地址;

二、数据存储

        8086CPU一次性可以处理两种尺寸的数据:

  • 字节(byte):一个字节由8个bit组成,可以存在8位寄存器中;
  • 字(word):一个字节由两个字节组成;
    • 这个字的高位字节存在这个寄存器的高8位寄存器;
    • 这个字的低位字节存在这个寄存器的低8位寄存器;

三、汇编指令

         主要对add和mov指令进行介绍。

        1、mov指令:用于将数据从一个操作数复制到另一个操作数。它是最常用的指令之一,主要用于数据的传递和初始化。MOV 指令可以操作寄存器、内存单元和立即数(常量)。

        基本格式:

MOV destination, source
其中:destination 是目标操作数,可以是寄存器、内存单元或段寄存器;source 是源操作数,可以是寄存器、内存单元或立即数;

        支持的操作数类型

寄存器与寄存器:如 MOV AX, BX。
寄存器与内存:如 MOV AX, [0100H]。
寄存器与立即数:如 MOV AX, 1234H。
内存与寄存器:如 MOV [0100H], AX。
内存与立即数:如  MOV [0100H], 5678H。
段寄存器与寄存器:如  MOV DS, AX。
段寄存器与立即数:如  MOV DS, 2000H。

         注意事项

MOV指令不能同时操作两个内存地址(如 MOV [0100H], [0200H] 是非法的)。
MOV 指令不能将立即数直接传给段寄存器(如 MOV DS, 1234H 是非法的)。
MOV 指令不能将立即数作为目的操作数(如 MOV 1234H, AX 是非法的)。
MOV 指令不会影响任何标志位(Flags)。

        2、ADD指令:用于将两个操作数相加,并将结果存回第一个操作数。它主要用于算术运算,如加法操作。ADD指令会修改标志位(如进位标志 CF、零标志 ZF、符号标志 SF 等)。

        基本格式:

ADD destination, source
其中:destination 是目标操作数,可以是寄存器或内存单元;source 是源操作数,可以是寄存器或内存单元;

         支持的操作数类型

寄存器与寄存器:如 ADD AX, BX。
寄存器与内存:如 ADD AX, [0100H]。
内存与寄存器:如 ADD [0100H], AX。
内存与内存:如 ADD [0100H], [0200H]

        注意事项

ADD 指令不能同时操作两个内存地址(如 ADD [0100H], [0200H] 是非法的)。
ADD 指令不能将立即数作为源操作数(如 ADD AX, 1234H 是非法的)。
ADD 指令会修改标志位(如进位标志 CF、零标志 ZF、符号标志 SF 等)。

 

        注意:

        指令的两个操作对象的位数要一致;

        当加法溢出时,高位会被舍弃;

四、物理地址

                每一个内存单元在空间中都由唯一的地址,这个唯一的地址称为物理地址。

                8086有20根地址总线,寻址能力为2^20(1M);

                8086的运算器最多一次可以处理16位数据,采用两个16位地址(段地址、偏移地址)合成一个20位的物理地址;

                地址加法器合成物理地址的方式:

                        物理地址 = 段地址 * 16 + 偏移地址;

 

        这三种方式都可以表示物理地址:123C8(CPU可以用不同的段地址偏移地址形成同一个物理地址);

         “段地址×16+偏移地址=物理地址”的本质含义:CPU在访问内存时,用一个基础地址(段 地址×16)和一个相对于基础地址的偏移 地址相加,给出内存单元的物理地址。

        偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。

五 、段寄存器
8086CPU有4个段寄存器:CS、DS、SS和ES。
(1)CS:IP
定义:
CS(代码段寄存器):用于存放当前程序代码段的 段地址;
IP(指令指针寄存器):用于存放当前指令在代码段中的 偏移地址;
用途:
IP 与 CS 结合,用于确定 CPU 下一条要执行的指令的物理地址。
工作流程:     
取指令:CPU 根据  CS:IP 计算出物理地址,从内存中读取指令。             
修改 IP:读取指令后,CPU 会自动更新  IP 的值,使其指向下一个要执行的指令。
执行指令:CPU 执行指令,重复上述过程。
意义:
逻辑地址与物理地址的关系 :在 8086 中, CS:IP  是一种  逻辑地址 ,而物理地址是通过  CS × 16 + IP  计算得出的;      
                         程序控制流 CS:IP  用于确定程序的执行流程,是程序跳转、函数调用等操作的基础;
                        内存管理 :通过修改  CS  和  IP ,可以实现程序的跳转、中断处理等操作。
 
        (2)DS:[address]
        
                定义:
DS(数据段寄存器):用于存放当前程序中数据的段地址;
[address] :一个偏移地址,表示从段地址开始的偏移量。
使用示例:
section .datadata db 12H, 34H, 56H, 78H  ; 定义一个字节数组section .textglobal _start_start:mov bx, .data              ; 将数据段地址赋给 BXmov ds, bx                 ; 将 BX 的值赋给 DSmov al, [0]                ; 从 DS:0 读取一个字节到 ALmov ah, 0x00               ; 设置 AH 为 0,表示输出一个字符mov dl, al                 ; 将 AL 的值赋给 DLint 0x80                   ; 调用系统调用输出字符

             注意事项:

                  不能直接赋值给 DS:8086 汇编语言不允许直接将段地址赋给 DS,必须通过通用寄存器(如 BX)进行中转。                           

                  区分字节和字:一个字由两个字节组成,高位字节存储在低地址单元,低位字节存储在高地址单元。例如,[0] 表示一个字节,[0] 和 [1] 表示一个字。                     

                   默认段地址:在程序开始时,DS 的默认值为 0,因此需要手动赋值。

        (3)SS:SP

                定义:

                        SS:用于存放堆栈段的段地址;

                        SP:用于存放堆栈顶元素的偏移地址;

                用途:SP 与 SS 结合,用于确定堆栈顶元素的物理地址。在堆栈操作中,SP 会随着 PUSH 和 POP 指令的执行而自动变化。

                 SS:SP 的作用:

                        指向栈顶元素:任意时刻,SS:SP 指向当前堆栈顶元素的物理地址。

                        入栈操作(PUSH):

                                SP = SP - 2:SP 先减 2,以确保下一个入栈操作的地址正确。

                                将数据写入 SS:SP 指向的内存单元。

                出栈操作(POP):

                                从 SS:SP 指向的内存单元读取数据。             

         SP = SP + 2:SP 先加 2,以指向下一个栈顶元素。

                注意事项:        

                        只能操作字(16 位) :8086 CPU 的堆栈操作是以为单位进行的,不能直接操作字节(8 位)。             

                        堆栈增长方向:堆栈是向下增长的,即每次入栈时,SP 会减小,出栈时 SP 会增大。             

        (4)ES:DI

                定义:

                        ES:用于存放额外数据段的段地址。它通常用于访问与程序主数据段(DS)分离但需要频繁访问的数据,例如字符串、数组等。

                        DI:用于存放目标地址的偏移量。

                        ES 与 DI 寄存器结合,用于指定目标地址。

 

 

 

    

                

http://www.hkcw.cn/article/EnaXyOnxlX.shtml

相关文章

Error creating bean with name *.PageHelperAutoConfiguration 异常解析

一、问题报错 微服务安装成功,启动失败,报错如下: 二、 Spring Boot应用启动错误分析 错误概述 这是一个Spring Boot应用启动过程中出现的Bean创建错误。根据错误堆栈,主要问题在于无法创建PageHelper分页插件的自动配置类。 …

【Zephyr 系列 3】多线程与调度机制:让你的 MCU 同时干多件事

好的,下面是Zephyr 系列第 3 篇:聚焦 多线程与调度机制的实践应用,继续面向你这样的 Ubuntu + 真板实战开发者,代码清晰、讲解通俗、结构规范,符合 CSDN 高质量博客标准。 🧠关键词:Zephyr、线程调度、k_thread、k_sleep、RTOS、BluePill 📌适合人群:想从裸机开发进…

AI万能写作v1.0.12

AI万能写作是一款高度自动化、智能化、个性化的AI智能软件,旨在通过人工智能技术进行内容整合创作,为用户提供便捷高效的写作辅助。这款APP能够一键生成各类素材内容,帮助用户快速获取思路和灵感,成为写作、学习、工作以及日常生活…

【Linux网络篇】:HTTP协议深度解析---基础概念与简单的HTTP服务器实现

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:Linux篇–CSDN博客 文章目录 一.三个预备知识认识域名认识URL认识URL编码和解码 二.http请求…

【JAVA后端入门基础001】Tomcat 是什么?通俗易懂讲清楚!

📚博客主页:代码探秘者 ✨专栏:《JavaSe》 其他更新ing… ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏作者水平有限,欢迎各位大佬指点&…

系统思考:成长与投资不足

最近认识了一位95后年轻创业者,短短2年时间,他的公司从十几个人发展到几百人,规模迅速扩大。随着团队壮大,用户池也在持续扩大,但令人困惑的是,业绩增长却没有明显提升,甚至人效持续下滑。尽管公…

PHP7+MySQL5.6 查立得轻量级公交查询系统

# PHP7MySQL5.6 查立得轻量级公交查询系统 ## 系统简介 本系统是一个基于PHP7和MySQL5.6的轻量级公交查询系统(40KB级),支持线路查询、站点查询和换乘查询功能。系统采用原生PHPMySQL开发,无需第三方框架,适合手机端访问。 首发版本&#x…

【笔记】Windows系统部署suna基于 MSYS2的Poetry 虚拟环境backedn后端包编译失败处理

基于 MSYS2(MINGW64)中 Python 的 Poetry 虚拟环境包编译失败处理笔记 一、背景 在基于 MSYS2(MINGW64)中 Python 创建的 Poetry 虚拟环境里,安装 Suna 开源项目相关包时编译失败,阻碍项目正常部署。 后端…

docker可视化工具

一、portainer(不常用) 1、安装portainer [rootlocalhost /]# docker run -d -p 8088:9000 --name portainer --restartalways -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --privilegedtrue portainer/portainer-c…

#16 学习日志软件测试

#16 #13布置的任务都没有wanc 反思一下 一个是贪玩 一个是懒 还有一个原因是学习方式 单看视频容易困 然后是一个进度宝贝 java ai 编程 完 挑着看的 廖雪峰教程 完 速看 很多过时 javaweb ai笔记 见到13.aop 小林coding 看到4.并发 java guide 还没开始 若依框架 笔…

【数据集】NCAR CESM Global Bias-Corrected CMIP5 Output to Support WRF/MPAS Research

目录 数据概述🔍 数据集简介:🧪 数据处理方法:📅 时间范围(Temporal Coverage):📈 模拟情景(Scenarios):🌡️ 关键变量(Variables):📏 垂直层级(Vertical Levels):💾 数据格式与获取方式:数据下载及处理参考🌍 数据集名称: NCAR CESM Global B…

如何用AI写作?

过去半年,我如何用AI高效写作,节省数倍时间 过去六个月,我几乎所有文章都用AI辅助完成。我的朋友——大多是文字工作者,对语言极为敏感——都说看不出我的文章是AI写的还是亲手创作的。 我的AI写作灵感部分来自丘吉尔。这位英国…

dvwa4——File Inclusion

LOW: 先随便点开一个文件,可以观察到url栏变成这样,说明?page是dvwa当前关卡用来加载文件的参数 http://10.24.8.35/DVWA/vulnerabilities/fi/?pagefile1.php 我们查看源码 ,没有什么过滤,直接尝试访问其他文件 在url栏的pag…

mysql数据库实现分库分表,读写分离中间件sharding-sphere

一 概述 1.1 sharding-sphere 作用: 定位关系型数据库的中间件,合理在分布式环境下使用关系型数据库操作,目前有三个产品 1.sharding-jdbc,sharding-proxy 1.2 sharding-proxy实现读写分离的api版本 4.x版本 5.x版本 1.3 说明…

Doris环境部署与应用开发

部署的方式有几种,可以下载github上的源码编译,这里直接下载官方最新的二进制包,差不多有4G。 wget -c https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-3.0.5-bin-x64.tar.gz tar -zxvf apache-doris-3.0.5-bin-x64.tar.gz mv apache-doris-3.0.…

Dify在Windows 11上的安装实战

一、引言 随着人工智能技术的飞速发展,大语言模型(LLM)的应用场景日益丰富,从智能客服到内容生成,再到复杂的数据分析,LLM正逐步渗透到各行各业。Dify,作为一个专注于AI应用开发的开源平台&…

C++之动态数组vector

Vector 一、什么是 std::vector?二、std::vector 的基本特性(一)动态扩展(二)随机访问(三)内存管理 三、std::vector 的基本操作(一)定义和初始化(二&#xf…

Spring Boot Starter 自动装配原理全解析:从概念到实践

Spring Boot Starter 自动装配原理全解析:从概念到实践 在Spring Boot开发中,Starter和自动装配是两个核心概念,它们共同构成了“开箱即用”的开发体验。通过引入一个Starter依赖,开发者可以快速集成第三方组件(如Red…

大模型相关

与大模型相关的问题 大预言模型(LLM )相关结构类型损失函数为什么大模型设计的参数量都是7B,13B,72B这种?大模型中的位置编码方式觉得当下的大模型相对于之前初代的bert等模型主要解决了什么样的问题?从原理…

数字规则:进制转换与原码、反码、补码

目录 引 一.不同进制的转换​ 1.二进制与十进制的转换​ (1).二进制转十进制​ (2).十进制转二进制​ 2.二进制与十六进制的转换​ (1).二进制转十六进制​ (2).十六进制转二进制​ 3.二进制与八进制的转换​ (1).二进制转八进制​ (2).八进制转二进制​ 4.十进制、…