汇编语言学习笔记——第三章 主存访问

内存中字的存储

  • 在CPU中用16位寄存器存储一个字,高八位存高字节,低八位存低字节。在内存中,由于内存单元是字节单元,一个字要使用两个地址连续的内存单元来存放。
  • 讲起始地址为N的字单元简称为N地址字单元。
    > 比如:2地址字单元,则这个字单元的起始地址为2,由2、3两个内存单元组成。

DS和[address]

DS存储器:通常用来存放要访问数据的段地址。

mov bx,1000H        将1000H送入bx寄存器
mov ds,bx           将bx里的内容送入ds中
mov al,ds:[0]          将内存地址ds:[0]中的内容送进al中
  • mov 指令将一个内存单元的内容送入一个寄存器中,
    但在指令中中必须指从哪个内存单元送到哪个寄存器,
    此时指令格式应该是:mov 寄存器名,内存单元地址

  • 从内存单元到寄存器的格式是:mov 内存单元地址,寄存器名

  • [...]表示一个内存单元,其内容表示内存单元的偏移地址,指令执行时,CPU自动取ds中的数据作为内存单元的段地址。

疑问:
为什么8086CPU不支持将数据直接送入段寄存器(ds)的操作?

回答:
这属于其硬件设计的问题!!!

CPU的栈机制

  • 8086CPU的入栈出栈操作都是以字为单位进行的。
  • 栈顶处于低位,栈底处于高位。
基本操作:
push ax     将寄存器ax的内容入栈
pop ax      从栈顶取出数据送入ax

注意:当进行POP操作后,所出栈的元素依然存在于原来的内存中,但是它已不在栈中。当再次执行push等入栈操作后将写入新的数据,将其覆盖。

段寄存器SS与寄存器SP

  • 段寄存器SS:存放栈顶的段地址。
  • 寄存器SP:存放栈顶的偏移地址。

任意时刻,SS:SP指向栈顶元素

执行push指令时,CPU先改变Sp,后向SS:SP处传入数据。
执行pop指令时,CPU先读取SS:SP处的数据,后改变SP。
提问:
当发生栈溢出时(栈满入栈,栈空出栈),CPU如何知道?

回答:
它不知道!8086CPU不保证我们的操作不会超界,它只考虑当前栈顶在何处、要执行的命令是哪一条。而栈溢出的问题,需要我们编程的时候自己考虑。