汇编语言笔记4
汇编语言笔记4
寄存器(内存访问)
内存中字的存储
由于内存单元是字节单元,一个单元存放一个字节。则一个字要用两个地址连续的内存单元来存储
这个字的高位字节存在高地址中,地位字节存在低地址中
例:4E20H存放:
DS和[address]
CPU要读写一个数据,必须知道数据的内存单元地址在哪。8086CPU中,内存地址由段地址和偏移地址组成,DS寄存器通常用来存放要访问的数据的段地址
例子:读取10000H单元的内容并存到al中:
1 | mov bx,1000H |
执行时,自动按照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不会帮我们判断,需要我们自己注意。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星辰微光的博客!





