CPU Segments

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

CPU Segments

eryar@163.com

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 

 

wps_clip_image-16116

wps_clip_image-30111

由上图可知,可以通过数据段寄存器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 

 

wps_clip_image-29098

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

wps_clip_image-7124

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

wps_clip_image-1832

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

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

目录
相关文章
CPU can only see the threads
In python, due to the GIL (Global Interpreter Lock), which is a mutex and ensures only one thread can execute at a time, so the multiple threads parallel execution is not supported under the CPython interpreter. But what about the multiple processes? What is the difference between them? How to choos
47 14
CPU can only see the threads
innodb_buffer_pool_instances 如何根据cpu和内存进行配置
`innodb_buffer_pool_instances` 是用于配置 InnoDB 缓冲池实例数的参数。每个实例都管理缓冲池的一部分,这有助于提高并发性能。通常,你可以根据系统的 CPU 和内存来调整这个参数,以获得更好的性能。 以下是一些建议和步骤,帮助你根据 CPU 和内存进行 `innodb_buffer_pool_instances` 的配置: 1. **了解系统资源:** 首先,了解系统的硬件资源,特别是内存和CPU。检查系统上可用的物理内存和 CPU 核心数量。 2. **考虑每个实例的大小:** 在配置 `innodb_buffer_pool_instances` 时,
359 0
PostgreSQL 垃圾回收参数优化之 - maintenance_work_mem , autovacuum_work_mem
PostgreSQL 垃圾回收参数优化之 - maintenance_work_mem , autovacuum_work_mem
3598 1