第三章——寄存器(内存访问)

为什么第三章还是寄存器?
很明显这一章和上一章并不相同,因为后面多了四个字。
很显然上一章,还有一些东西还没有讲完。
所以我们再来看一看第三章讲了些啥。

字单元:即存放一个字型数据(word,16位)的内存单元,由两个地址连续的内存单元(8位)组成。
DS(data segment)是数据寄存器,用于存储需要访问的数据。
[address]:这个是用于定位DS中的数据的,其中address为偏移地址,那么段地址呢?命令执行时,CPU会自动取DS中的数据,作为段地址。
如:

mov al, [0]

8086CPU不支持将数据直接送入DS,什么意思?也就是说,我们要想把数据送入DS,我们需要先将数据送入寄存器,再送入DS,如:

mov bx, 1000H
mov ds, bx

这里送入DS,不是指将数据送入数据栈,而是将地址送入ds指针。
如果是送入数据,需要这样做:

mov bx,1000H
mov ds,bx
mov [0],al

刚刚只是进行字节型数据的传送(8bit),但是我们8086CPU是16位的,也就是说我们可以一次传送一个字,所以这里做个示范:

mov bx,1000H
mov ds,bx
mox ax,[0]
moc [0],cx

汇编指令补充:

sub A,B     //指将A中的值减去B的值

还有一个数据段的额概念,和前面的代码段类似,就不再赘述。
接下来是栈,栈的基本定义没有什么好讲的。
我们来看一下CPU提供的栈机制。
首先,我们对于栈有两个操作:

push A      //将A的数据放入栈中,A是寄存器或者[address]
pop A       //将栈顶的数据放入A中,A的含义同上

这也是两个非常简单的操作(基本上学过编程的人都知道)。
那么同样的问题来了,那么这个栈在哪呢?
CPU会将栈的数据放在内存的哪个位置呢?
所以这就涉及到另外两个寄存器了SS和SP
SS(stack segment),即栈寄存器。
和CS类似,SS中存放的是段地址,而SP存放的是偏移地址。
所以SS:SP指向的就是我们所使用的栈的栈顶元素
还有一点,栈底是一个栈空间的高位,也就是说该栈的指针随着数据的压入,是由高位指向低位。
比如:SS:SP指向1000EH,再压入数据时,SS:SP指向1000CH.
下面是一个非常重要的问题,就是栈空间只是我们自己YY的一个东西,CPU永远不知道我们究竟把哪一段看作是栈,也就是说,CPU不会报告给我们栈溢出的问题
栈满时,如果再次放入数据,就会覆盖与之相邻的其他内存
同样,栈空时,如果再次取数据,也会去到与之相邻的内存的数据。
所以,这个栈空间的问题只能由我们程序员自己注意了。
还有一个概念,栈段,应该都知道啥意思(仿照代码段和数据段),我就不讲了。
这样的话,第三章就这些了。

猜你喜欢

转载自blog.csdn.net/cggwz/article/details/79249658