【新书推荐】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

相关文章

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数

Python Pillow 库详解文档(最新推荐)

《PythonPillow库详解文档(最新推荐)》Pillow是Python中最流行的图像处理库,它是PythonImagingLibrary(PIL)的现代分支和继承者,本文给大家介绍Pytho... 目录python Pillow 库详解文档简介安装核心模块架构Image 模块 - 核心图像处理基本导入

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.

Java日期类详解(最新推荐)

《Java日期类详解(最新推荐)》早期版本主要使用java.util.Date、java.util.Calendar等类,Java8及以后引入了新的日期和时间API(JSR310),包含在ja... 目录旧的日期时间API新的日期时间 API(Java 8+)获取时间戳时间计算与其他日期时间类型的转换Dur

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主