寄存器(内存访问)1

222 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一个字有两个字节大小

 

DS [address]

1.Data Segment数据段寄存器

2.偏移地址

 

sub 相减

CPU不止认识1和0 还认识加法

 

所有一切运算都能化成加法

3.1内存中字的存储

image.png

低对低 高对高 相对应

字型数据和字节型数据

image.png

3.2 DS和[address]

CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址

8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址

 

mov指令的三种传送功能

image.png

mov al,[0] 索引对应的内存单元

image.png

 

mov指令的格式:

mov 寄存器名,内存单元地址

“[...]”表示一个内存单元 ,“[...]”中的0表示内存单元的偏移地址

内存单元的段地址是DS

8086CPU自动获取DS中的数据为内存单元的段地址

image.png

为什么不能将1000H直接放入DS(段寄存器中)

8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器。

数据可直接送入通用寄存器

mov ds,1000H是非法的

 

数据->通用寄存器->段寄存器

如何将通用寄存器中的数据送入内存中

使用段寄存器做媒介

image.png

3.3字的传送

image.png

sub ax,bx

其中sub ax,bx就是ax中的值减bx中的值,等于1,然后把结果,也就是1,放入ax中。

 

3.4 mov、add、sub指令

image.png

image.png

 

image.png

为什么add的操作对象不能是段寄存器

硬件限制

 

3.5数据段

image.png

用cs指向该数据:代码段

用ds指向该数据:数据段

 

3.1~3.5小结

image.png

image.png

可行 mov ax,[0] 段地址默认在DS寄存器中

 

检测点3.1

image.png

2662
E626
E626
2662
D6E6
D6E6
05B2
0
00E6
0
0026
000C

image.png

image.png

3.6栈

image.png

注意:pop只是复制栈顶的数据,并非剪切

image.png

CPU如何知道一段内存空间被当做栈使用

段寄存器SS 存放栈顶的段地址

寄存器SP 存放栈顶的偏移位置

任何时刻,SS:IP指向栈顶元素

 

执行push和pop的时候,如何知道哪个单元是栈顶单元?

image.png

push指令的执行过程

image.png

如果将1000H~1000FH这段空间当做栈,初始状态栈是空的,此时,SS=1000H,SP=?

SP=0010H

指向最高地址单元的下一个单元

image.png

image.png pop之后 1000CH和1000DH单元中仍有数据内容存在

attention:

image.png