汇编语言第2章 寄存器

*****本章学习*****

一、学习目标

• 了解通用寄存器

• 掌握字数据在寄存器中的存储

• 掌握物理地址的计算方法,并理解其本质

• 理解段的概念

• 了解段寄存器

• 掌握寄存器CS和IP的用途

• 掌握汇编指令mov,add和jmp的基本用法

二、学习内容

扫描二维码关注公众号,回复: 3587527 查看本文章

1、补充:相关基础知识总览

2、通用寄存器

3、字在寄存器中的存放

4、汇编指令:mov,add

5、8086给出物理地址的方法

6、CS和IP

~~~~1、相关基础知识总览

(1)CPU概述

&&知识点:

a.一个典型的CPU由运算器、控制器、寄存器等器件组成

b.内部总线实现CPU内部各个器件之间的联系

c.外部总线实现CPU和主板上其他器件的联系

ps:对于一个汇编程序员来说,CPU中的主要部件是寄存器

(2)本课程声明

本课程内容介绍基于8086CPU

8086是Intel系列中16位微处理器,地址总线20位

8086有14个16位寄存器:

AX,BX,CX,DX(通用寄存器)

SI,DI,BP,SP   (基址和变址寄存器)

CS,SS,DS,ES(段寄存器)

IP,FLAGS           (指令指针和标志寄存器)

ps:汇编语言中不区分大小写

~~~~2、通用寄存器

&&知识点:

(1)8086CPU中,寄存器AX,BX,CX,DX通常用于存放一般性数据,称为通用寄存器。 

(2)每个寄存器均为16位。

(3)存放的无符号数据范围:0~65535

(4)为了保证兼容,AX,BX,CX,DX这四个寄存器可拆分成两个8位寄存器单独使用

• AX分为AH和AL

• BX分为BH和BL

• CX分为CH和CL

• DX分为DH和DL

eg:   以AX为例,可将AH和AL作为8位寄存器单独使用

AH和AL存放的无符号数据范围:0~255

 

ps:这张图让我想起了大端法,小端发还有还有检测点2.1的题目。做的时候不是很熟悉,我不停地要看AH和AL的位置

~~~~3、字在寄存器中的存储

(1)字和字节

• 字节  内存划分的基本单位  byte

• 字      两个字节

• 双字  四个字节

• 四字  八个字节

ps:一个字由两个字节组成,可以存在一个16位寄存器中,前面的是高位字节,后面的是低位字节,这让我想到了字节的存储,包括怎么看它的地址

&&知识点:

字的高8位-->存放于通用寄存器的高8位寄存器

字的低8位-->存放于通用寄存器的低8位寄存器

~~~~4、汇编指令:mov,add

(1)引例

 

(2)指令使用注意事项

• 在mov和add指令中,两个操作对象的位数应一致

 

• 运算时超出寄存器表示的位数的情形

 

注意:这里的AL和AH各自作为独立的寄存器使用!

Conclusions:

这一部分内容我主要不熟悉16进制数的计算,看上去跟普通的加法区别不大,但是可能不熟悉16进制数的表示,做的时候稍微有点困难,检测点2,1花了不少时间。

还有就是AH和AL的位置,AH在前面,AL在后面,一开始做检测点2.1的时候不停地看PPT和书,后来慢慢地熟悉了也就算的快一点了

上图的那个1看上去好像丢失了,AX中的数据为:0058H。但实际上,CPU并没有真正丢弃这个进位值

*****检测点2.1*****

(1)写出每条汇编指令执行后相关寄存器中的值

mov  ax,62627     AX=f4a3h

mov  ah,31H         AX=31a3h

mov  al,23H          AX=3123h

add   ax,ax           AX=6246h

mov  bx,826CH    BX=826ch

mov  cx,ax           CX=6246h

mov  ax,bx           AX=826ch

add   ax,bx           AX=04d8h

mov  al,bh            AX=0482h

mov  ah,bl            AX=6c82h

add   ah,ah           AX=d882h

add   al,6              AX=d888h

add   al,al             AX=d810h

mov  ax,cx           AX=6246h

(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方

ps:这道题跟实验一中的任务2类似,有两种写法

(a)让CS和IP指向2000:0000然后运行这段代码

mov  ax,1

add   ax,ax

jmp   2000:0003

(b)直接用a命令输入以下代码然后用t命令执行

mov  ax,2

add   ax,ax

add   ax,ax

add   ax,ax

Conclusions:

对于我来说,计算还比较薄弱,所以第一个计算我在算完了之后打到电脑里去试了,看看有没有算错的

容易搞混的就是那个数字后面的h,在写的时候是要加上H的,但是到了输入代码的时候就不加H了

ps:在quiz当中两次出现了计算题,那个数字后面都是加H了,为了加深印象,我把这个检测点放在了博客里提醒自己

~~~~5、8086给出物理地址的方法

(1)内存单元的物理地址

&&知识点:

(a)CPU访问内存单元时要给出内存单元的地址

(b)所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址

(2)8086表示物理地址的解决途径

问题:16位的寄存器无法直接表示20位的物理地址,怎么解决呢?

 

“段”是8086为解决用16位寄存器表示20位的物理地址而引入的一个逻辑上的概念

Conclusions:

8086在内部用两个16位地址通过计算合成得到一个20位的物理地址

基础地址 × 16 + 偏移地址 = 物理地址

段地址 × 16 + 偏移地址 = 物理地址

段地址是一个段的起始物理地址

~~~~6、相关说明

(1)8086中,通过段地址:偏移地址来间接描述内存单元的物理地址

CPU根据如下公式计算得到物理地址:

物理地址 = 段地址 × 16 + 偏移地址

其中:

(a)“段地址:偏移地址”也称“逻辑地址”

(b)“段地址 × 16”构成段的起始物理地址,故根据需要划分段使用时,段的起始物理地址必须是16的倍数

(2)段的划分是灵活的,一个物理地址可以用不同的“段地址:偏移地址”表示

(3)在写法上,地址通常用十六进制表示。表示十六进制的H在“段地址:偏移地址”中可省略不写

Conclusions:

(1)物理地址 = SA * 16 + EA

(2)EA的变化范围为0h~ffffh

(3)偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64K

~~~~7、CS和IP

• 引入

(1)指令和数据是应用上的概念。在内存中,它们均以二进制形式存在

(2)计算机在工作是通过CS:IP来判断哪些是指令

(3)8086CPU有4个段寄存器:CS、DS、SS、ES

&&知识点:

CS:代码段段寄存器,用于存放代码段的“段地址”

IP:指令指针寄存器,用于存放CPU将要读取的指令在代码段中的偏移地址

CS:IP对应的物理地址存放的是CPU将要读取的指令

• 计算机工作过程

第1步:CPU基于CS:IP,计算出物理地址,然后到相应的内存单元读取指令,送到指令缓冲区

第2步:CPU自动修改IP的值,IP = IP + 所读取指令的长度,从而为下一条指令读取做准备

第3步:执行指令,转第1步,重复此步骤

 

• 修改CS和IP的指令jmp

  

*****检测点2.3*****

下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?

mov  ax,bx

sub   ax,ax

jmp   ax

解:CPU 4次修改IP

第一次:读取mov  ax,bx之后

第二次:读取sub   ax,ax之后

第三次:读取jmp    ax之后

第四次:执行jmp    ax修改IP

最后IP中的值是0000H

ps:类似的一道题出现在了quiz当中,我忘记了最后一次执行也会改变IP的值,所以把这道题拿出来放在了博客里提醒自己

*****延伸阅读*****

 

这张图来自深入理解计算机系统,课上的时候并没有非常理解这张图,有些东西不熟悉

CPU:中央处理单元

ALU:算术/逻辑单元

PC:程序计数器

USB:通用串行总线

总线:贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递

I/O设备:系统与外界的联系通到,每个I/O设备都是通过一个控制器或适配器与I/O总线连接起来的

主存:临时存储设备,在处理器执行程序时,它被用来存放程序和程序处理的数据

处理器:CPU,是解释存储在主存中指令的引擎

有了这些理解,再去看那张图就不那么困难了,有些时候一张看似很复杂的图,把它拆分开来也就没有那么复杂了

学习也是如此,一个很大的知识点,一次性吃下来不太可能,但是如果把它拆分成几个小的知识点,理解起来就会容易很多,学的也更快

猜你喜欢

转载自www.cnblogs.com/yinghuapiaoluo/p/9789027.html