当前位置:网站首页>王爽汇编语言详细学习笔记二:寄存器
王爽汇编语言详细学习笔记二:寄存器
2022-07-06 09:24:00 【Deteriorate_Kr】
文章目录
前言
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
内部总线实现CPU内部各个器件之间的联系。
外部总线实现CPU和主板上其它器件的联系。
简单地说,在CPU中:
1.运算器进行信息处理
2.寄存器进行信息存储
3.控制器控制各种器件进行工作
4.内部总线连接各种器件,在他们之间进行数据的传送
对于一个汇编程序员来说,CPU中的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。当然不同的CPU,寄存器的个数、结构是不相同的。
8086CPU有14个寄存器 它们的名称为:
AX、BX、CX、DX、SI、DI、SP、BP、
IP、CS、SS、DS、ES、PSW。
一、通用寄存器
8086CPU所有的寄存器都是16位的,可以存放两个字节。
AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。
下面以AX为例,我们看一下寄存器的逻辑结构
8086上一代CPU中的寄存器都是8位的;
为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
AX可以分为AH和AL;
BX可以分为BH和BL;
CX可以分为CH和CL;
DX可以分为DH和DL。
H是高位,High
L是低位,Low
高位←低位
AX的低8位(0位~ 7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。
AH和AL寄存器是可以独立使用的8位寄存器。
二、字在寄存器中的存储
字节:byte,一个字节由8个bit组成,可以存在8位寄存器中
字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节
在8086的AX寄存器中,在AH中存储了它的高8位,在AL中存储了它的低8位。AH和AL中的数据,既可以看成是一个字型数据的高8位和低8位,也可以看成是两个独立的字节型数据。
由于一个内存单元可以存放 8位数据,CPU中的寄存器又可存放 n 个 8位数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。
用十六进制来表示数据可以直观的看出这个数据是由哪些8位数据构成的
三.几条汇编指令
mov ax,18=MOV AX,18
bx=BX…
本来ax应该=1044c,但别忘了AX是16位寄存器,1044c有20位,所以这里要舍去高位1,留下044c。所以AX=044CH。
AL=C5H+93H=158H,但AX是16位寄存器。AL只能存放八位数据,所以AL要舍去高位1,留下58,所以AL=18H。AX=0058H
注意:1.此时al是作为一个独立的8位寄存器来使用的,和ah没有关系,CPU在执行这条指令时认为ah和al是两个不相关的寄存器。
2.这里的丢失,指的是进位制不能在 8 位寄存器中保存,但是 CPU 并不是真的丢弃 这个进位值,这个问题会在后面的课程中讨论。
3.在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的例如:
mov ax,bx
mov bx,cx
mov ax,18h
mov al,18h
add ax,bx
add ax,20000等都是正确的指令,而:
mov ax,bl (在8位寄存器和16位寄存器之间传送数据)
mov bh,ax (在16位寄存器和8位寄存器之间传送数据)
mov al,20000 (8位寄存器最大可存放255的数据)
add al,100H (将一个高于8位的数据加到一个8位寄存器中)
等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致
四.地址
CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。
CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以有不同的形成物理地址的方式。我们现在讨论80865CPU是如何在内部形成内存单元的物理地址的。
1. 16位结构的CPU
8086CPU是16位机,而它的上一代(8080、8085)等是8位机。
概括的讲,16位结构描述了一个CPU具有以下几个方面特征:
1、运算器一次最多可以处理16位的数据。
2、寄存器的最大宽度为16位。
3、寄存器和运算器之间的通路是16位的。
也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位。内存单元的地址再送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存放16位的地址。
2. 8086CPU给出物理地址的方法
8086有20位地址总线,可传送20位地址,寻址能力为1M。
8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
当8086CPU要读写内存时,
1.CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
2.段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
3.地址加法器将两个16位地址合成为一个20位的物理地址
4.地址加法器通过内部总线将20位物理地址送入输入输出控制电路
5.输入输出控制电路将20位物理地址送上地址总线
6.20位物理地址被地址总线传送到存储器
地址加法器合成物理地址的方法:
物理地址=段地址×16+偏移地址
“段地址x16”有一个更为常用的说法是左移4位。计算机中的所有信息都是二进制的形式存储的,段地址当然也不例外。机器只能处理二进制信息,“左移4位”中的位,指的是二进制位。
观察移位次数和各种形式数据的关系:
(1)一个数据的二进制形式左移1位,相当于该数据乘以2;
(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;
(3)地址加法器如何完成段地址×16的运算?
以二进制形式存放的段地址左移4位。
规律:**一个数据的十六进制形式左移1位,相当于这个数据对应的十进制形式乘以16,也相当于这个数据对应的十六进制形式乘以10H(10H=10);**一个数据的十进制形式左移1位,相当于这个数据的对应的十进制形式乘以10;一个X进制的数据左移1位,相当于这个数据对应的十进制形式乘以X。一个X进制的数据左移N位,相当于这个数据对应的十进制形式乘以X的N次方。二进制左移4位相当于16进制左移一位
3.“段地址×16+偏移地址=物理地址”的本质含义
它的本质含义是:CPU在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
更一般的说,8086CPU的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址x16可看做是寄出地址
在第一张纸上写上200(段地址),在第二张纸上写上826(偏移地址)。然后200(段地址)x10+826(偏移地址)=2526(物理地址)
4.段的概念,真实内存没有被分段,段的划分来自于CPU
以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
5.内存单元地址小结
比如CPU要访问21F60H单元,则它给出的段地址SA和偏移地址EA满足SAX16+EA=21F60H即可。
习题:
有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为____,最大为____。
首先偏移地址EA的范围为0H~FFFFH
所以最大的SA=(20000H-0H)/10H=2000H
最小的SA=(20000H-FFFFH)/16(o)=1001H
20000H=131072
FFFFH=65535
(131072-65535)/16=4,096.0625,有余数,向上取整,取到4097
4097=1001H,所以SA的最小值为1001H
五.段寄存器
段寄存器就是提供段地址的。
8086CPU有4个段寄存器:
CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、ES(附加段寄存器)
当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。
1.CS和IP
CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
CS为代码段寄存器;
IP为指令指针寄存器。
8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行,而且找到地址后IP会自动递增
内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候把有的信息看作指令,有的信息看作数据。
CPU根据什么将内存中的信息看作指令?
CPU将CS:IP指向的内存单元中的内容看作指令。
在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。
2.修改CS、IP的指令
在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
我们如何改变CS、IP的值呢?
8086CPU必须提供相应的指令
先回想我们如何修改AX中的值?用mov指令,其实8086CPU大部分寄存器的值,都可以用mov指令来改变,mov指令是传送指令。
但mov指令不能用于设置CS、IP的值,因为8086CPU没有提供这样的功能
。
8086CPU为CS、IP提供了另外的指令来改变它们的值:jmp转移指令
1.若想同时修改CS、IP的内容:
jmp 段地址:偏移地址
jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取命令
jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取命令
功能:用指令中给出的段地址修改CS,偏移地址修改IP。
2.仅修改IP的内容:
jmp 某一合法寄存器
jmp ax (类似于 mov IP,ax)
jmp bx
jmp某一合法寄存器指令的功能为:用寄存器中的值修改IP。
比如:jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H
指令执行后:ax=1000H,CS=2000H,IP=1000H
jmp bx,指令执行前:bx=0B16H,CS=2000H,IP=0003H
指令执行后:bx=0B16H,CS=2000H,IP=0B16H
3.问题分析
初始状态下CS=2000H,IP=0000H,物理地址=CSx16+IP=20000H。
1.首先执行 mov ax,6622H
2.IP自增,执行 jmp 1000:3
3.此时CS=1000H,IP=0003H,转到1000x16+0003=10003H处执行
mov ax,0000
4.IP自增,mov bx,ax 。此时bx=ax=0000H,
5.jmp bx ,此时IP=0000H,CS=1000H
6.转到10000H处执行 mov ax,0123H
7.执行第三步
所以总结下来,结果为:
(1)mov ax,6622
(2)jmp 1000:3
(3)mov ax,0000
(4)mov bx,ax
(5)jmp bx
(6)mov ax,0123H
(7)转到第(3)步执行
4.代码段
对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为 16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段
mov ax,0000 (B8 00 00)
add ax,0123H (05 23 01)
mov bx,ax (8B D8)
jmp bx (FF E3)
这段长度为 10 字节的字节的指令,存在从123B0H~ 123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存单元是用来存放代码的 ,是一个代码段 ,它的段地址为123BH,长度为10字节。
如何使得代码段中的指令被执行呢?
将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。
CPU 只认被 CS:IP 指向的内存单元中的内容为指令。
所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。
CS = 123BH,IP = 0000H。
5.小结
1、段地址在8086CPU的寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。
2、CS存放指令的段地址,IP存放指令的偏移地址。
8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。
3、8086CPU的工作过程:
(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP指向下一条指令;
(3)执行指令。(转到步骤(1),重复这个过程。)
4、8086CPU提供jmp转移指令修改CS、IP的内容。
边栏推荐
- Captcha killer verification code identification plug-in
- 指针 --按字符串相反次序输出其中的所有字符
- Pointer -- output all characters in the string in reverse order
- Sqqyw (indifferent dot icon system) vulnerability recurrence and 74cms vulnerability recurrence
- Record an edu, SQL injection practice
- 浙大版《C语言程序设计实验与习题指导(第3版)》题目集
- High concurrency programming series: 6 steps of JVM performance tuning and detailed explanation of key tuning parameters
- Get started with Matplotlib drawing
- 关于交换a和b的值的四种方法
- SystemVerilog discusses loop loop structure and built-in loop variable I
猜你喜欢
数字电路基础(三)编码器和译码器
内网渗透之内网信息收集(三)
5 minutes to master machine learning iris logical regression classification
Uibutton status exploration and customization
On the idea of vulnerability discovery
《统计学》第八版贾俊平第六章统计量及抽样分布知识点总结及课后习题答案
Database monitoring SQL execution
Network technology related topics
Matplotlib绘图快速入门
Statistics 8th Edition Jia Junping Chapter 14 summary of index knowledge points and answers to exercises after class
随机推荐
SystemVerilog discusses loop loop structure and built-in loop variable I
后台登录系统,JDBC连接数据库,做小案例练习
Keil5-MDK的格式化代码工具及添加快捷方式
JDBC 的四种连接方式 直接上代码
数据库多表链接的查询方式
Solutions to common problems in database development such as MySQL
Fundamentals of digital circuit (V) arithmetic operation circuit
Get started with Matplotlib drawing
四元数---基本概念(转载)
Pointer -- output all characters in the string in reverse order
Feature extraction and detection 14 plane object recognition
《统计学》第八版贾俊平第十章方差分析知识点总结及课后习题答案
函数:计算字符串中大写字母的个数
图书管理系统
Library management system
刷视频的功夫,不如看看这些面试题你掌握了没有,慢慢积累月入过万不是梦。
Pointers: maximum, minimum, and average
指针:最大值、最小值和平均值
关于超星脚本出现乱码问题
Intranet information collection of Intranet penetration (2)