汇编语言笔记4

寄存器(内存访问)

内存中字的存储

由于内存单元是字节单元,一个单元存放一个字节。则一个字要用两个地址连续的内存单元来存储

这个字的高位字节存在高地址中,地位字节存在低地址中

例:4E20H存放:

DS和[address]

CPU要读写一个数据,必须知道数据的内存单元地址在哪。8086CPU中,内存地址由段地址和偏移地址组成,DS寄存器通常用来存放要访问的数据的段地址

例子:读取10000H单元的内容并存到al中:

1
2
3
mov bx,1000H
mov ds,bx
mov al,[0]

执行时,自动按照DS中给出的段地址,中括号中的偏移地址取得10000H单元的内容并送入al中。

8086CPU不支持直接将数据送入段寄存器,只能先借助寄存器“中转”

8086CPU有16根数据线,所以只要在指令中给出16位的寄存器就可以传送16位的数据(字)了。

数据段

编程时,可以根据需要,将一组内存单元定义为一个段,我们可以将一组长度为64KB,地址连续,起始地址为16的倍数的内存单元当作一个数据段

用DS存放段地址。

CPU提供的栈机制、栈段

栈段

我们可以根据需要,将长度小于64kb,地址连续,起始地址为16的倍数的内存单元定义为栈段来使用。

但是,为了防止栈顶越界,一个栈的大小最大只能为64KB-2B,因为栈空时栈顶指针指向栈底的下一个地址

栈是从高地址向低地址生长的,先入栈的会先存在高地址处。

栈机制,push和pop

CPU如何知道栈顶的位置?段寄存器SS,保存了栈的段地址,寄存器SP,保存了偏移地址,任何时刻,SS:SP指向栈顶元素。

  • push指令:SP=SP-2,SS:SP指向当前栈顶前面的单元,作为新的栈顶,再将数据送入。此时SS:SP即指向新的栈顶(这也是为什么栈空时栈顶指针指向栈底的下一个地址)
  • pop指令:先将当前SS:SP指向的地址中的数据取出,然后SP=SP-2,指向新的栈顶。注意:取出的数据仍在内存中,但已经不在栈中。向栈再次push时,原有的数据会被覆盖。

栈顶超界的问题

8086CPU不会帮我们判断,需要我们自己注意。