第3章 寄存器(内存访问)

在内存中存储时,内存单元是一个字节byte单元,则一个字Word要用两个地址连续的内存单元来存放,低位字节存放在低地址单元,高位字节存放在高地址单元
字单元:由两个地址连续的内存单元组成,起始地址为N的字单元简称为N地址字单元
image

0地址字单元4E21H,1地址字单元124EH......

DS和[address]

8086中有一个DS寄存器,通常用来存放要访问数据的段地址
mov bx,1000H
mov ds,bx
mov al,[0]
将10000H(1000:0)中的数据读到al中
这里[...]表示一个内存单元,括号里面表示偏移地址,指令执行时8086CPU自动读取ds中数据作为内存单元的段地址
8086CPU不支持将数据直接送入段寄存器,只好用一个寄存器中转
16位结构,有16根数线,所以一次可以传送16位数据,也就是一个字

mov add sub都是带有两个操作对象的指令,而jump具有一个

编程时根据需要定义数据段,可以在具体操作的时候用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元

栈是一种具有特殊访问方式(最后进入空间的数据,最先出去)的存储空间
image
image

栈的两个基本操作:入栈和出栈,入栈就是将新的元素放到栈顶,出栈就是将栈顶元素取出一个
栈的操作规则被称为:LIFO(Last In First Out,后的进先出来)

编程时,可以将一段内存当作栈
push ax 将ax中数据入栈
pop ax 从栈顶取出数据到ax
操作都是以字为单位进行的
8086CPU中任意时刻,段寄存器SS(栈的段地址):寄存器SP(偏移地址)指向栈顶元素,push指令和pop指令执行时,CPU从SS和SP中得到栈顶地址
push ax两步走
1> SP=SP-2,SS:SP指向当前栈顶前面的单元,作为新栈顶
2> 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶
入栈时,栈顶从高地址向低地址方向增长。
pop ax两步走
1> 将SS:SP指向的内存单元处数据送入ax
2> SP=SP+2,SS:SP指向当前栈顶下面的单元,作为新的栈顶
值得注意的时,出栈后pop操作前的栈顶元素仍然存在,但是它已经不在栈中,再次push后会在那里写入新数据覆盖

由上面数据不在栈中进而可以思考栈顶超界的问题
8086CPU不保证我们对栈的操作不会超界
当我们把一段内存当作栈空间,当栈满时再执行push栈顶超出栈空间,栈空间外数据被覆当栈空时再次执行pop栈顶超出了栈空间,而超出的地方的数据会被覆盖,自己需要注意
用栈暂存以后需要恢复寄存器中的内容时,出栈顺序和入栈顺序相反
push和pop实质上是一种内存传送指令
编程时根据需要可定义栈段

段的综述

对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的数据段中内容当作数据来访问
对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令
对于栈段,将它的地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU进行栈操作时,将我们定义的栈段当作栈空间用
由此可见CPU将内存中内容当作什么,是因为相应的段寄存器指向了那里

posted @ 2022-01-20 17:23  摸鱼的Beck  阅读(93)  评论(0)    收藏  举报