博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CPU Segments
阅读量:6278 次
发布时间:2019-06-22

本文共 1261 字,大约阅读时间需要 4 分钟。

CPU Segments

1.Introduction

8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。段地址在8086CPU的段寄存器中存放,8086CPU有4个段寄存器:CS,DS,SS,ES。

CS为Code Segment,代码段寄存器,结合指令指针寄存器IP(Instruction Pointer)来确定要执行的下一条指令的内存地址;

DS为Data Segment,数据段寄存器;

SS为Stack Segment,栈段寄存器;

ES为Extra Segment,附加寄存器;

我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址来访问段内的单元,这完全是我们自己来安排。我们可以设定一个段存放数据,将它定义为DS;设定一个段存放代码,将它定义为CS;设定一个段当作栈,将它定义为SS。

对于数据段,将它的地址放在DS寄存器中,用mov, add, sub等访问内存单元时,CPU就将我们定义的数据段中的内容当作数据来访问;

对于代码段,将它的地址放在CS寄存器中,将段第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令;

对于栈段,将它的段地址放在SS寄存器中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作时,比如执行push, pop指令,就将我们定义的栈段当作栈空间来使用。

2. Data Segment

通过DS寄存器,可以设置任意内存中的数据。

mov ax
,
1000
 
mov ds
,
ax 
mov ax
,
1123
 
mov [
0
]
,
ax 

 

由上图可知,可以通过数据段寄存器DS来设置内存中的数据。

3. Stack Segment

现在的CPU中都有栈的设计,8086CPU也不例外。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,在基于8086CPU编程时,可以将一段内存当作栈来使用,并提供了入栈和出栈的指令push, pop。那么问题来了,如何任性地指定哪段内存作为栈来使用呢?8086CPU中提供了两个寄存器SS和SP来完成这项任务。栈顶的段地址存放在段寄存器SS中,偏移地址存放在SP中。这个用法和CS:IP的用法是一样的。

mov ax
,
1000
 
mov ss
,
ax 
mov ds
,
ax 
mov ax
,
10
 
mov sp
,
ax 
push
 ax 

 

将上述代码通过A命令,输入到Debug程序中。

通过命令T来执行上述代码。

通过两次push,将1000:000E处和1000:000C处的值设置成了ax中的值。字在内存中存储时,要用两个地址连续的内存单元来存放,字的低字节存放在低地址单元,高位字节存放在高地址单元。通过上图可以看出入栈push时,栈顶指针SP寄存器是在减少的,每次减少了一个字,即两个字节。出栈的过程SP的过程正好相反,是在增加的。

从上面的例子还可以看出,同一段内存空间,即可以用来当作数据段,也可以用来当作栈来使用。

转载地址:http://hubva.baihongyu.com/

你可能感兴趣的文章
Eclipse导入MyEclipse创建的WEB项目无法识别的解决方案
查看>>
MySQL:日期函数、时间函数总结
查看>>
公交线路查询接口文档
查看>>
restlet(javase版本) 的最基本使用
查看>>
Oracle优化学习
查看>>
布局之BFC
查看>>
峰Spring4学习(7)spring对JDBC的支持
查看>>
Log使用
查看>>
I - How many prime numbers
查看>>
两数之和---简单
查看>>
Linux文本处理三剑客之grep
查看>>
SQL Server 可疑的解决办法
查看>>
匿名函数
查看>>
大数加法
查看>>
python第二天
查看>>
Kaggle(一):房价预测
查看>>
Android开发历程_10(LayoutAnimationController的初步使用)
查看>>
apache https 伪静态
查看>>
FileUtil
查看>>
[CQOI 2014] 数三角形 & 机械排序臂
查看>>