第三章 寄存器知识总结

8086 CPU内存与栈操作

内存中字的存储

用16位寄存器来存储一个字,一个字要用两个地址连续的内存单元来存放(一个单元存放一个字节),⚠️其顺序是高-高,低-低,即小端法

字单元概念:即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节,取低地址内存单元地址为字数据地址

n地址字单元:起始地址为n的字单元。

 

ds和【address】

ds:存放要访问数据的段地址。

mov指令的两种传送:

1.将数据直接送入寄存器(两个操作数要一样长

2.将一个寄存器的内容送入另一个寄存器

3.将一个内存单元中的内容送入一个寄存器中:mov 寄存器名,内存单元地址。(两个内存单元之间不能直接传送数据。

⚠️8086cpu不支持将数据直接送入段寄存器的操作。只好用一个寄存器进行中转。

 

mov,add,sub指令

⚠️在mov, add, sub等汇编指令中,访问内存单元时,默认情况下,指的是数据段

mov指令有如下三种形式:

(1)mov 寄存器,段寄存器

(2)mov 内存单元,段寄存器

(3)mov 段寄存器,内存单元

 

栈    (SS) × 16 + (SP)  → 栈顶的物理地址

栈是一种具有特殊的访问方式的储存空间。

特殊型:最后进入这个空间的数据,最先出去。后进先出

两个基本操作:

入栈:将一个新的元素放到栈顶。

出栈:从栈顶取一个元素。

 

cpu提供的栈机制

最基本的两个指令:(都是以为单位进行的;操作对象不能是常数

PUSH(入栈)

POP(出栈)

段寄存器ss,sp

ss:栈顶的段地址存放在其中

sp:偏移地址存放在其中

任何时刻ss:ip指向栈顶元素。cpu从ss,sp中得到栈顶的地址。

入栈(push)步骤:

(1)sp=sp-2,ss:sp指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶。

(2)将寄存器中的内容送入ss:sp指向的内存单元处,ss:sp指向新栈顶。

出栈(pop)步骤:ss:sp指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

(1)将ss:sp指向的内存单元处的数据送入ax中。

(2)sp=sp+2,

⚠️栈空时,ss:sp指向栈空间最高地址单元的下一个单元。

⚠️出栈的内存仍然存在,只是不在栈中。

 

栈顶超界的问题:

超出了栈空间,其他内存将被覆盖。8086cpu不保证我们对栈的操作不会超界。因此我们在编程的时候要自己操心栈顶超界的问题。

 

push,pop指令

格式:push:寄存器,段寄存器,内存单元(让数据入栈)。

pop :寄存器,段寄存器,内存单元(接收出栈的数据)。

⚠️不能直接向段寄存器ss中送入地址。

 

point

push和pop指令访问的内存单元的地址不是在指令中给出的,是由ss:sp指出的。

Push,pop等栈操作指令,修改的只是sp。栈顶的变化范围最大为0~ffffh。因此,一个栈段的最大容量为64kb

 

转载于:https://www.cnblogs.com/makaya/p/9864738.html

### 关于《计算机组成原理》第二章知识点总结 针对《计算机组成原理》,由蒋本珊所著版本中的第二章节,主要涵盖了数据表示与运算相关内容。具体而言: #### 数据的机器级表示 - **数值数据**:介绍了定点数和浮点数的概念及其编码方式。对于整数部分采用原码、反码及补码三种形式来表达正负数[^1]。 - **字符字符串**:ASCII标准被用来定义常见字符集;而汉字则通过GB2312等多种国家标准进行编码。 #### 运算方法和技术 - **加减乘除基本算法实现**:描述了如何利用逻辑电路完成这些基础操作,并讨论了几种优化技术如快速乘法器的设计思路。 - **溢出处理机制**:当计算结果超出寄存器所能容纳范围时采取何种措施确保系统的稳定性和准确性得到了深入探讨。 #### 浮点运算部件设计 - **IEEE754标准下的浮点数格式**:详细解释了单精度(32位)、双精度(64位)两种规格下各字段的意义以及规范化原则。 - **特殊值处理**:包括无穷大(INF)、非数字(NaN)等情况,在实际应用中应怎样合理对待进行了说明。 上述内容构成了该书第二章的主要框架,旨在帮助读者理解计算机内部是如何高效准确地执行各种类型的数学运算工作的。 ```python def add_binary_numbers(x, y): max_len = max(len(x), len(y)) x = x.zfill(max_len) y = y.zfill(max_len) result = '' carry = 0 for i in range(max_len - 1, -1, -1): r = carry r += 1 if x[i] == '1' else 0 r += 1 if y[i] == '1' else 0 result = ('1' if r % 2 == 1 else '0') + result carry = 0 if r < 2 else 1 if carry != 0: result = '1' + result return result.zfill(max_len) ``` 此代码展示了两个二进制数相加的过程,体现了计算机底层运算的一个简单例子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值