汇编语言第2章 寄存器
Posted yinghuapiaoluo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言第2章 寄存器相关的知识,希望对你有一定的参考价值。
*****本章学习*****
一、学习目标
? 了解通用寄存器
? 掌握字数据在寄存器中的存储
? 掌握物理地址的计算方法,并理解其本质
? 理解段的概念
? 了解段寄存器
? 掌握寄存器CS和IP的用途
? 掌握汇编指令mov,add和jmp的基本用法
二、学习内容
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,是解释存储在主存中指令的引擎
有了这些理解,再去看那张图就不那么困难了,有些时候一张看似很复杂的图,把它拆分开来也就没有那么复杂了
学习也是如此,一个很大的知识点,一次性吃下来不太可能,但是如果把它拆分成几个小的知识点,理解起来就会容易很多,学的也更快
以上是关于汇编语言第2章 寄存器的主要内容,如果未能解决你的问题,请参考以下文章