一个虚拟主机如何做两个网站,济南做外贸的网站公司吗,常州外贸网站建设,网站什么引导页1、内存中字的存储 2、ds和【address】
CPU要读写一个内存单元的时候#xff0c;必须先给出这个内存单元的地址#xff0c;在8086CPU中#xff0c;内存地址由段地址和偏移地址组成#xff0c;
其中#xff0c;段地址存放在段寄存器DS中#xff0c;DS称作数据段寄存器。…1、内存中字的存储 2、ds和【address】
CPU要读写一个内存单元的时候必须先给出这个内存单元的地址在8086CPU中内存地址由段地址和偏移地址组成
其中段地址存放在段寄存器DS中DS称作数据段寄存器。
如果我们要将内存地址为14A70的内存单元中的数据送入AL中可以用如下的程序段进行
Mov bx1000H ;把段地址1000H送入bx中。
mov dsbx ;把bx中的数值送入ds中。
Mov al[4a70] ;把段地址为1000H偏移地址位4a70H的内存单元中的数据送入al中。
[address]表示一个内存单元内存单元中的address表示偏移地址它的中文翻译就是地址的意思。
内存单元[address]我们可以知道它的地址是多少但它的数值是多少我们并不知道。
3、mov指令
传送指令mov可以完成以下4种传送
1将数据直接送入寄存器。 如mov ax1230H。
2将一个寄存器中的数据送入另一个寄存器。 如mov axbx
3将一个内存单元中的数据送入一个寄存器。 如mov ax[27b0]
4将一个寄存器中的数据送入内存单元中。 如mov [607c]bx
注意不能直接用数据送给段寄存器如mov ds1230H 是错误的必须要用一个寄存器来进行中转。比如
Mov bx1230H
Mov dsbx
这样就行了。为什么8086CPU不支持将数据直接送入段寄存器呢这属于8086CPU硬件设计的问题我们只要知道这一
点就行了。
4、add和sub指令
Mov指令有两个操作对象add和sub同样有两个操作对象。
Add为加法指令格式add 操作对象1操作对象2。功能两数相加并把结果保存到操作对象1中。
Add有以下几种形式
Add 寄存器数据 如add ax, 8
Add 寄存器寄存器 如add ax, bx
Add 寄存器内存单元 如add ax, [27a0]
Add 内存单元寄存器 如add [46e9], bx Sub为减法指令格式sub 操作对象1操作对象2。功能两数相减即从操作对象1减去操作对象2其结果保存到
操作对象1中。
Sub 也有以下几种形式
Sub 寄存器数据 如sub ax, 9
Sub 寄存器寄存器 如sub ax, bx
Sub 寄存器内存单元 如sub ax, [b027]
Sub 内存单元寄存器 如sub [8601], bx
5、数据段
前面讲过参见2.7节对于8086PC机在编程时可以根据需要将一组内存单元定义为一个段。我们可以将一组长度
为NN≤64KB、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间从而定义了一个数据段。
比如用123B0H~123B9H这段内存空间来存放数据我们就可以认为123B0H~123B9H这段内存是一个数据段长度
为10个字节。
如何访问数据段中的数据呢首先用DS存放数据段的段地址然后用相关的指令访问数据段中的内存单元。
比如将123B0H~123B9H的内存单元定义为数据段现在要累加这个数据段中的前3个单元中的数据代码如下
Mov ax, 123BH
Mov ds, ax ;将123BH送入ds中作为数据段的段地址。
Mov al, 0 ;用al存放累加结果先把al中的数据清零。
Add al, [0] ;将数据段第一个单元偏移地址为0中的数值加到al中。
Add al, [1] ;将数据段第二个单元偏移地址为1中的数据加到al中。
Add al, [2] ;将数据段第三个单元偏移地址为2中的数据加到al中。 在1.5节中我们说过在内存中指令和数据没有任何区别都是二进制信息CPU在工作的时候把有的信息看作指令
把有的信息看作数据那么CPU在什么时候把它看作指令在什么时候把它看作数据呢在2.5节中我们回答了第一个问题现
在可以回答第二个问题了。
答只要把这一段内存单元的段地址放到DS中在用mov、add、sub等访问内存单元的指令时CPU就会将这些内存单
元看作数据来访问。
6、栈
栈是一种具有特殊的访问方式的存储空间它的特殊性就在于最后进入这个空间的数据最先出去。可以用一个盒子和3本书
来描述栈的这种操作方式。
入栈把A放入栈中再把B放入栈中然后再把C放入栈中。就形成了A、B、C
出栈先出栈顶C然后是B然后A
特点先进后出
入栈和出栈。入栈就是将一个新的元素放到栈顶出栈就是从栈
顶取出一个元素。栈顶的元素总是最后入栈需要出栈时又最先被从栈中取出栈的这种操作规则被称为LIFOlast in first out,
后进先出 7、cpu提供的栈机制
现今的CPU中都有栈的设计。8086CPU提供的入栈和出栈指令最基本的两个是push入栈和pop出栈。比如
Push ax 表示将寄存器ax中的数据送入栈中pop ax 表示从栈顶取出数据送入ax。8086CPU的入栈和出栈操作都是以字为
单位进行的。
下面两张图描述了push和pop指令的执行过程。 上面两张图指令的执行过程写成代码如下
Mov ax, 123H
Push ax
Mov bx, 2266H
Push bx
Mov cx, 1122H
Push cx
Pop ax
Pop bx
Pop cx
注意字型数据用两个内存单元存放高地址单元存放高8位低地址单元存放低8位。
看了上面两张图后现在提出两个问题。问题1我们将10000H~1000FH这段内存当作栈来使用CPU是如何知道这段空
间是栈关于这个问题将在3.10节解答。
问题2push ax等入栈指令执行时要将寄存器中的数据放入当前栈顶单元的上方成为新的栈顶元素pop ax等指令执
行时要从栈顶单元取出数据送入寄存器中。显然push、pop在执行的时候CPU必须要知道哪个单元是栈顶单元可是如
何知道
答8086CPU中有两个寄存器堆栈段寄存器SS堆栈指针寄存器SP栈顶的段地址存放在SS中偏移地址存放在
SP中任意时刻SS:SP指向栈顶元素push和pop指令在执行时CPU从SS和SP中得到栈顶单元的地址。
现在我们可以完整地描述push和pop指令的功能了例如push ax。push ax的执行由以下两步完成
1. SPSP2SS:SP指向当前栈顶前面的单元以当前栈顶前面的单元为新的栈顶。
2. 将ax中的数据送入SS:SP指向的内存单元处SS:SP此时指向新栈顶。
下图描述了push ax的执行过程。 将10000H~1000FH这段空间当作栈段SS1000H栈空间大小为16字节栈最底部的字单元地址为1000:000E任
意时刻SS:SP指向栈顶当栈中只有一个元素的时候SS1000HSP000EH栈为空就相当于栈中唯一的元素出栈后
SPSP2原来为000EH加2后SP0010H所以当栈为空的时候SS1000HSP0010H。
换一个角度看任意时刻SS:SP指向栈顶元素当栈为空的时候栈中没有元素也就不存在栈顶元素所以SS:SP只能指
向栈的最底部单元下面的单元该单元的偏移地址为栈最底部的字单元的偏移地址2栈最底部字单元的地址为1000:000E
所以栈空时SP0010H。
接下来我们描述pop指令的功能例如pop ax。Pop ax的执行过程和push ax刚好相反由以下两步完成
1. 将SS:SP指向的内存单元处的数据送入ax中。
2. SPSP2SS:SP指向当前栈顶下面的单元以当前栈顶下面的单元为新的栈顶。
下图描述了pop ax的执行过程。 注意上图中出栈后SS:SP指向新的栈顶1000EHpop操作前的栈顶元素1000CH处的数据2266H依然存在但
是它已不在栈中当再次执行push等入栈指令后SS:SP移至1000CH并在里面写入新的数据将它覆盖。
8、push指令 pop指令
Push和pop指令的格式有如下两种形式
第一种形式push 寄存器 ;将一个寄存器中的数据入栈。 Pop 寄存器 ;出栈用一个寄存器接收出栈的数据。
这一种形式它们可以在栈和寄存器之间传送数据。
注意上面的寄存器可以是段寄存器比如可以是push ds、pop ds。
第二种形式push 内存单元 ;将一个内存单元中的字型数据入栈注意栈操作都是以字为单位。 Pop 内存单元 ;出栈用一个内存字单元接收出栈的数据。
比如mov ax, 1000H Mov ds, ax ;将内存单元的段地址放在DS中。 Push [2a38] ;将内存单元[2a38]中的字型数据入栈。 Pop [2a3a] ;出栈出栈的数据送入内存单元[2a3a]。
这一种形式它们可以在栈和内存单元之间传送数据。
指令执行时CPU要知道内存单元的地址可以在push、pop指令中给出内存单元的偏移地址段地址在指令执行时CPU
从DS中取得。
Push和pop实质上是一种内存传送指令与mov指令不同的是push和pop指令访问的栈空间的地址不是在指令中给出
的而是由SS:SP指出的。同时push和pop指令还要改变SP中数值。Mov指令只需一步操作就是传送而执行push、
Pop指令需要两步操作执行push时先改变SP后向SS:SP处传送执行pop时先读取SS:SP处的数据后改变SP。
9 、 栈段
前面讲过参见2.7节对于8086PC机在编程时可以根据需要将一组内存单元定义为一个段。我们可以将长度为N
N≤64KB的一组地址连续、起始地址为16的倍数的内存单元当作栈空间来用从而定义了一个栈段。
比如我们将10010H~1001FH这段内存空间当作栈来用以栈的方式进行访问这段空间就可以认为是一个栈段大小为
16个字节。
如何使得如push、pop等栈操作指令访问我们定义的栈段呢那就是要将SS:SP指向我们定义的栈段。
现在我们来回答3.8节中的第一个问题。答只要这段内存单元被SS:SP指向那么CPU就会把这段空间当作栈来使用。