本文主要是介绍【新书推荐】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节 通用寄存器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!