【新书推荐】6.1节 通用寄存器

2024-02-04 21:04

本文主要是介绍【新书推荐】6.1节 通用寄存器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第六章 8086 CPU寄存器

         CPU是我们学习的第一个计算机硬件。16位汇编语言中,涉及CPU的控制和操作是通过CPU内部的寄存器实现的。我们可以把寄存器看作是在CPU内部有独立命名的存储空间,寄存器的名称即该存储空间的地址。这章我们将讲述8086 CPU内各个寄存器的功能和使用方法。

6.1节 通用寄存器

         我们在第一章计算机的硬件组成中简单描述了CPU内部的AX寄存器是用来存储数据的。这一节我们将详细讲解CPU内的通用寄存器。

         本节内容:通用寄存器。

         ■CPU的内部组成:8086 CPU内部由控制单元、算术逻辑运算单元、地址加法器和14个16位寄存器组成。8086 CPU寄存器组按功能划分为4个16位数据寄存器,两个16位指针寄存器,两个16位变址寄存器,一个16位指令指针,四个16位段寄存器,一个16位标志寄存器。

         ■数据寄存器:4个16位数据寄存器AX、BX、CX、DX,用于存储数据。每个16位数据寄存器分为两个8位数据寄存器。

         ■数据寄存器的特殊用途:8个16位通用寄存器及其对应的2个8位数据寄存器除了正常的存储数据的用途之外,还有一些特定的用途,参见表6-4。

         ■变址寄存器和指针寄存器:变址寄存器SI、DI常用数据段内的寻址,也是字符串操作中的默认指针,DS:[SI]指向源地址,ES:[DI]指向目的地址。指针寄存器SP、BP常用于堆栈内的寻址,SP永远指向栈顶,BP作为栈内基址寄存器使用。此外,数据寄存器BX也可以作为数据段内的基址寄存器使用。8086 CPU中只有SI、DI、BP和BX四个寄存器用来寻址。

6.1.1 CPU的内部组成

    8086 CPU的内部组成如图6-1所示:

    ■运算器进行算术逻辑运算;

■寄存器存储信息;

■控制器控制计算机各种器件进行工作;

■内部总线连接各种器件,在它们之间进行数据传送。

寄存器是程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容实

现对CPU的控制。地址寄存器存储地址信息,数据寄存器存储数据信息。

图6-1 CPU的内部组成

6.1.2 8086 CPU寄存器组

8086 CPU内包括四个16位数据寄存器,两个16位指针寄存器,两个16位变址寄存器,一个16位指令指针,四个16位段寄存器,一个16位标志寄存器,一共14个16位寄存器。

如图6-2所示,通用寄存器包括四个16位数据寄存器、两个16位指针寄存器和两个16位变址寄存器。接下来我们分别讲解这三组寄存器。

图6-2 8086CPU寄存器组

6.1.3 数据寄存器

四个16位数据寄存器:AX、BX、CX、DX;主要用来保存操作数或运算结果等信息。由于CPU访问内部寄存器的速度远快于访问内存,所以它们的存在节省了为存取操作数所需占用总线和访问存储器的时间。每个16位数据寄存器分为两个8位数据寄存器。如图6-3所示:

图6-3  16位数据寄存器AX的逻辑结构

AX=AH(高8位,高字节)+AL(低8位,低字节),AX和AL寄存器称为累加器,通常用于保存算术运算的结果。

BX=BH+BL。BX寄存器除了作为数据寄存器之外,也可以作为基地址寄存器。它是4个数据寄存器中唯一可以作为存储器指针使用。

谨慎

         在8086计算机中,只有BP、SI、DI、BX四个通用寄存器可以用来寻址,其他寄存器不可以。到了80386及以上CPU,所有通用寄存器都可以用来寻址。

CX=CH+CL,CX寄存器称为计数寄存器。在字符串操作和循环操作时,用来控制重复循环次数。移位操作时,CL寄存器用来保存移位的位数。

DX=DH+DL,DX寄存器称为数据寄存器。除此之外,进行32位乘除法操作时,用来存放被除数的高16位或余数。乘法操作时用来保存高16位乘积。它也用于存放I/O端口地址。

举例

如图6-4,AX寄存器存储的值为20,二进制数:0001 0100B;十六进制数:14H

图6-4 AX寄存器存储的值

如图6-5所示,AH寄存器存储的值为4EH,AL寄存器存储的值为20H,则AX寄存器存储的值为4E20H。

图6-5 AH、AL寄存器存储的值

6.1.4 数据寄存器的特殊用途

8个16位通用寄存器及其对应的2个8位数据寄存器除了正常的存储数据的用途之外,还有一些特定的用途。如表6-4所示。

■AX、DX、AH、AL寄存器在乘除法中,默认为目的操作数,用来保存乘积或商;我们将在第八章8086指令系统的算术运算指令中详细讲解。

■BP、SI、DI和BX四个寄存器可以在地址表达式中使用,作为寻址寄存器。其中BP寄存器通常在堆栈内寻址,因此也称BP寄存器为栈内基址寄存器。BX是4个16位数据寄存器中唯一可以用来寻址的寄存器。SI和DI在字符串指令中作为默认指针寄存器,DS:[SI]指向源地址,ES:[DI]指向目的地址。我们将在第十七章字符串处理详细讲解。

■CX寄存器作为LOOP循环指令的循环计数器。在字符串指令重复前缀REP中CX作为循环计数器。具体使用方法将在第十章和第十七章中详细讲解。

■CL寄存器作为移位计数器。在8086CPU指令中,移位位数只能为1或CL。

■SP寄存器称为栈顶指针寄存器,SP寄存器永远指向堆栈栈顶。每次出栈、入栈操作,SP的值都会发生变化,因而在16位汇编中不能使用SP寄存器作为堆栈内的指针寄存器。

6-4 通用寄存器的专门用途

提示

         此时,作为初学者,可能会因为这些概念性的理论知识而头疼。其实不必担心,目前并不要求能够完全理解这些理论知识。计算机编程是一门强调动手动脑的实践课程,在后续的章节中,我们会通过大量的示例和练习来验证这些理论。是否还记得卖油翁的一句话?“无它,唯熟耳!”

动手实验7:在debug调试器中演示数据寄存器的工作过程

在Debug调试器中输入并执行如下代码片段:

汇编指令

控制CPU完成的操作

用高级语言的语法描述

mov ax,28H

将28h送人寄存器AX

AX=28H

mov ah,98H

将98h送人寄存器AH

AH=98H

add ax,18h

将寄存器AX中的数值加上18h

AX=AX+18h

mov ax,bx

将BX寄存器中的值送人寄存器AX

AX=BX

add ax,bx

将AX和BX中的值相加,结果存在AX中

AX=AX+BX

                                        表6-5 数据寄存器实验一

在Debug调试器中的操作步骤如图6-6所示:

  

图6-6 数据寄存器实验一

动手实验8:在Debug调试器中输入下面的代码片段,计算AX寄存器的值

汇编指令

指令执行后AX中的值

指令执行后BX中的值

mov ax,4E02H

4E02H

0000H

add ax,1408H

620AH

0000H

add bx,1000h

620AH

1000H

add ax,bx

720AH

1000H

mov bx,ax

720AH

 

 

 

720AH

 

 

add ax,bx

?

720AH

                                        表6-6 数据寄存器实验二

动手实验9:在Debug调试器中输入下面的代码片段,计算AX寄存器的值

汇编指令

指令执行后AX中的值

指令执行后BX中的值

mov ax,001AH

001AH

0000H

mov bx,0036H

001AH

0036H

add al,bl

0050H

0036H

add ah,bl

3650H

0036H

mov bh,al

3650H

 

 

 

5036H

 

 

mov ah,0

0050H

5036H

add al,85H

00D5H

 

 

 

5036H

 

 

add al,91H

?

5036H

                                        表6-7 数据寄存器实验三

         实验8和实验9留给读者独立完成。

提示

1.在汇编语言语句中,不区分字母大小写。

2.在Debug调试器中,操作数默认为十六进制数,不需要添加后缀‘H’。

6.1.5 变址寄存器和指针寄存器

变址寄存器和指针寄存器

变址寄存器(SI/DI)和指针寄存器(BP/SP)主要用于存放某个存储单元地址的偏移,或某组存储器单元开始地址的偏移,作为存储器指针使用。

作为寄存器,可以保存16位算术逻辑运算中的操作数和运算结果,有时运算结果就是需要的存储单元地址的偏移。在8086计算机中,变址寄存器和指针寄存器不可以分解成8位寄存器使用。

变址寄存器和指针寄存器主要作用是实现多种存储器操作数的寻址,从而方便的实现对多种类型数据的操作。

SI和DI寄存器

SI和DI寄存器称为变址寄存器。在字符串操作中,规定由SI给出源指针,由DI给出目的指针,所以SI也称为源变址寄存器,DI也称为目的变址寄存器。SI和DI也可以作为一般存储器指针使用。

举例

mov si,0            ;si=0  

mov di,0            ;di=0  

mov si,offset mess  ;将数据段变量mess的偏移送入si

mov ax,[si]        ;将si偏移处对应的存储单元的16位值送入ax

mov ax,[di]         ;将di偏移处对应的存储单元的16位值送入ax

mov di,offset mess  ;将数据段变量mess的偏移送入di

BP和SP寄存器

BP和SP寄存器称为指针寄存器。BP主要用于给出堆栈中数据区基址的偏移,从而方便地实现直接存取堆栈中的数据,所以BP也称为栈内基指针寄存器。在16位汇编中,正常情况下,SP也只作为堆栈指针使用,SP永远指向栈顶,即保存堆栈顶地址的偏移。在8086计算机中,入栈操作时,SP寄存器自动减2,出栈操作时,SP寄存器自动加2。关于堆栈的内容将在“6.2节段寄存器”中详细讲解。

举例

;定义16个字节的堆栈段

stack segment

    db 16       ; 分配堆栈段16个字节的存储空间

stack ends

;

mov ax,stack    ;将堆栈段地址标号stack送入ax寄存器      

mov ss,ax       ;将ax的值存入ss堆栈段寄存器  

mov sp,16       ;sp堆栈指针指向堆栈段的栈顶偏移地址10H处

push bp         ;将bp寄存器的值压入堆栈,此时sp=14(sp-2)

mov bp,sp       ;bp=sp

pop ax          ;将当前堆栈段栈顶存储的值pop到ax寄存器,此时sp=16(sp+2)

■数据寄存器BX通常可以作为基址寄存器,表示数据段中,某一段数据的起始地址。

举例

;定义数据段

data segment

table db 0,1,2,3,4,5,6,7,8,9            ; table处以字节为单位存储0~9十个数

var   db 10,11,12,13,14,15,16,17,18,19  ; var处以字节为单位存储10~19十个数

data ends

;

mov bx,offset table     ;将数据段变量table的偏移送入基址寄存器bx=0

mov si,offset var       ;将数据段变量var的偏移送入变址寄存器si=10

mov al,[bx+si+2]        ;将bx+si+2偏移对应的存储单元内的值12存入al寄存器

练习

1、请写出每条汇编指令执行后,相关寄存器中的值。

mov ax,62354                AX=?

mov ah,31H               AX=?

mov al,12H                AX=?

add ax,ax                AX=?

mov bx,4523H                  BX=?

mov cx,ax                CX=?

mov ax,bx                AX=?

add ax,bx                 AX=?

mov al,bh                AX=?

mov ah,bl                AX=?

add ah,ah                AX=?

add al,6                 AX=?

add al,al                AX=?

mov ax,cx                 AX=?

注意:数值的不同进制表示方法。

本文摘自编程达人系列教材《X86汇编语言基础教程》。资料下载:www.bcdaren.com

这篇关于【新书推荐】6.1节 通用寄存器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s