王爽 《汇编语言》 读书笔记 二 寄存器

来源:互联网 发布:java行业发展前景 编辑:程序博客网 时间:2024/05/29 08:22

第二章  寄存器


cpu由运算器,控制器,寄存器等器件组成。靠内部总线相连。

1)运算器进行信息处理;

2)寄存器进行信息存储;

3)控制器控制各种器件进行工作;

4)内部总线连接各种器件,在它们之间进行数据等传输。

程序员主要关注cpu中等寄存器。

8086的寄存器 AX BX CX DX SI DI SP BP IP CS SS DS ES PSW


2.1 通用寄存器

4个16位通用寄存器 AX BX CX DX 存放一般数据

AX 可以分为 AH AL

BX -》 BH BL

CX -》CH CL

DX -》 DH DL

低位存中L 寄存器, 高位存在H寄存器


2.2 字中寄存器中的存储

字节 Byte  = 8bit

字  Word = 2Byte


2.3 几条汇编指令

mov

add

汇编指令和寄存器名不区分大小写

对al 操作产生对进位不会影响ah对值  只有对ax操作会同时影响ah 和al

即add al,93h  这是一条8位操作指令 产生对结果不影响ah


在进行数据传送或运算时,要注意指令对两个操作对象对位数应当是一致对


检测点2.1

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

mov ax, 02H

add ax, ax     --2

add ax, ax     --3

add ax, ax    --4


2.4 物理地址

每个内存单元对唯一地址称为物理地址。


2.5 16位结构cpu

1)运算器一次最多可以处理16位对数据

2)寄存器对最大宽度为16位

3)寄存器和运算器之间对通路为16位


2.6 8086cpu给出物理地址的方法

8086内部用两个16位地址合成的方法来形成一个20位的物理地址(20位地址总线)

16位段地址 + 16位偏移地址  -(地址加法器) -》 20位物理地址

8086要读写内存时:

1)cpu相关部件提供两个16位地址,一个称为段地址,一个称为偏移地址;

2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;

3)地址加法器将两个16位地址合成为一个20位的物理地址;

4)地址加法器通过内部总线将20位物理地址送到输入输出控制电路

5)输入输出控制电路将20位物理地址送给地址总线;

6)20位物理地址被地址总线送到存储器。


物理地址 = 段地址x16 + 偏移地址

段地址x16 也称为左移4位(二进制位)

一个x 进制对数据左移1位,相当于乘以x


2.7  段地址x16+偏移地址=物理地址  的本质含义

cpu在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

即,基础地址+偏移地址=物理地址    段地址x16可以看作基础地址


2.8 段的概念

其实内存本身并没有分段。 段的划分来自编程。使我们可以用分段对方式来管理cpu内存

一个段的起始地址必然是16的倍数;偏移地址为16位(寻址为64KB),所以一个段的最大长度为64KB


内存单元地址小结


cpu 访问内存时,必须向内存提供内存单元的物理地址。8086cpu在内部用段地址和偏移地址移位相加对方式来形成最终的物理地址。

1)cpu可以用不同的段地址+偏移地址形成同一个物理地址。 SAx16+EA 满足相同即可

2)仅使用偏移地址来寻址最多可以寻64KB个内存单元。

数据在21F60H单元描述为   数据在2000:1F60

可以根据需要将地址连续,起始地址为16倍数的一组内存单元定义为一个段。


2.9 段寄存器

CS DS SS ES


2.10 CS和IP

指示了cpu当前要读取指令的地址。

CS为代码段寄存器,  IP为指令指针寄存器。

cpu从  CSx16 + IP 的物理地址读取一条指令执行。 即cpu将CS:IP指向对内容当作指令执行。

参考书 P26 讲解cpu执行指令的过程图。

简要描述如下:

1)从CS:IP指向对内存单元读取指令,读取对指令进入指令缓冲器;

2)IP=IP+所读取指令对长度,从而指向下一条指令;

3)执行指令。转到步骤(1),重复这个过程。

8086加电启动以后CS和IP被设置为 CS=FFFFH  IP=0000H,即cpu从内存FFFF0H单元读取指令执行,FFFF0H单元中的指令是8086开机后执行对第一条指令。

CPU将CS:IP指向的内存单元中的内容看作指令。


2.11 修改CS,IP的指令

mov 称为传送指令。但不能修改CS, IP的值

jmp可以修改CS,IP的值,称为转移指令。

jmp 段地址:偏移地址。 用指令中的段地址修改CS  偏移地址修改IP

若仅修改IP地址  jmp  寄存器名 

例如jmp ax    把ax寄存器的值复制给IP


2.12 代码段

将一段内存当作代码段,仅仅是编程时的一种安排,cpu并不会由于这样的安排自动将我们定义的代码段中的指令当作指令来执行。

cpu只认CS:IP指向内存单元中的内容为指令。 所以想让cpu执行我们的指令就要让cpu指向CS:IP所定义的代码段中的第一条指令的首地址。


2.9 ~2.12 小结

1)段地址在8086cpu的段寄存器中存放。当8086要访问内存时,由段寄存器提供内存单元的段地址。8086cpu有4个段寄存器,其中cs用来存放指令的段地址。

2)CS存放指令的段地址,IP存放指令的偏移地址。

8086中,任意时刻CPU将CS:IP指向的内容当作指令执行。

3)8086cpu的工作过程。

a。从CS:IP指向的内存单元读取指令,读取指令进入指令缓冲器;

b。IP指向下一条指令

c。执行指令(并转到步骤a,重复这一过程)

4)8086提供转移指令修改CS,IP的内容。


debug命令的几个重要参数


查看,修改CPU中寄存器的内容:R

查看内存中的内容:D

修改内存中的内容:E命令(可以写入数据,指令(机器码),中内存中,它们实际上没有区别)

将内存中的内容解释为机器指令对应的汇编指令:U

执行CS:IP指向内存单元处的指令:T命令

以汇编指令的形式向内存中写入指令:A命令


实验:

修改FFF00H~FFFFFH中的内存空间有一个时间日期,

使用  -e FFF00H:XXX “08/20/17”

修改为当前日期发现无效,原因是此处内存区域为只读。


修改B8100H开始的内存区域

例如  -e B810:0000 01 01 02 02 03 03 04 04等

发现屏幕上出现来奇怪等符号。原因是修改来显存等内容。


推测,早期DOS时代某些病毒或者恶意程序会导致显示花屏。推测就是因为显存被修改了。


原创粉丝点击