CPU Segments

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的过程正好相反,是在增加的。

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

内容概要:本文详细介绍了QY20B型汽车起重机液压系统的设计过程,涵盖其背景、发展史、主要运动机构及其液压回路设计。文章首先概述了汽车起重机的分类和发展历程,强调了液压技术在现代起重机中的重要性。接着,文章深入分析了QY20B型汽车起重机的五大主要运动机构(支腿、回转、伸缩、变幅、起升)的工作原理及相应的液压回路设计。每个回路的设计均考虑了性能要求、功能实现及工作原理,确保系统稳定可靠。此外,文章还详细计算了支腿油缸的受力、液压元件的选择及液压系统的性能验算,确保设计的可行性和安全性。 适合人群:从事工程机械设计、液压系统设计及相关领域的工程师和技术人员,以及对起重机技术感兴趣的高等院校学生和研究人员。 使用场景及目标:①为从事汽车起重机液压系统设计的工程师提供详细的参考案例;②帮助技术人员理解和掌握液压系统设计的关键技术和计算方法;③为高等院校学生提供学习和研究起重机液压系统设计的实用资料。 其他说明:本文不仅提供了详细的液压系统设计过程,还结合了实际工程应用,确保设计的实用性和可靠性。文中引用了大量参考文献,确保设计依据的科学性和权威性。阅读本文有助于读者深入了解汽车起重机液压系统的设计原理和实现方法,为实际工程应用提供有力支持。
8255是一个并行输入/输出接口芯片,常用于早期计算机系统中控制多种外设,包括数码管显示。要使用它来显示0到9的数字,通常会配置成三个功能:一组作为数据线(例如DB口),另一组作为选通信号(例如RS口),以及低位地址线(如A0、A1)。 首先,你需要将8255的DB口连接至数码管的数据端,RS口设置为输出,低电平表示显示段码,高电平表示清零。每个数码管有七个段(a-g),通过组合可以形成0-9的编码。 以下是简化的emu8086 CPU代码示例,假设我们有一个8255接口已经初始化好了: ```assembly ; 导入8255相关的寄存器地址 DB_PORT equ 0x20 ; 数据总线端口 RS_PORT equ 0x21 ; 选择信号端口 ADDR_PORT equ 0x22 ; 地址线 ; 数码管段码存储区 SEGMENTS DB 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F ; 显示0的函数 DISPLAY_ZERO PROC MOV AL, SEGMENTS ; 将0的段码放入AL OUT DB_PORT, AL ; 发送数据到DB口 OUT RS_PORT, 0 ; RS=0,显示段码 ENDP ; 显示其他数字... DISPLAY_NINE PROC MOV AL, SEGMENTS + (9 - 1) * 8 ; 九对应的段码偏移量 ... (类似上面的指令) ENDP ; 要显示0,你可以这样调用: CALL DISPLAY_ZERO ``` 注意这只是一个基本的示例,实际应用中还需要处理数码管的驱动状态变化和用户输入转换等细节。此外,这个例子假定你已经在内存中预先设置了对应数码管段码的数组。执行过程中可能会涉及中断或者其他复杂的控制逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值