上篇叙述了8086CPU的通用寄存器和代码寄存器的一些东西。仅仅这些是远远不够的,显而易见的一个原因是,如果CPU只是对自己内部的寄存器进行操作,不能同外部数据进行交互,那么将无法完成任何工作。
数据段寄存器DS:
8086CPU中的DS寄存器专门用来存放准备访问的数据的段地址。[n]则表示一个偏移地址,这个偏移地址同DS中表示的段地址一起确定最终要访问的内存地址。
以下汇编语句表示从10000H地址中的数据读入寄存器AL中:
MOV BX, 1000 MOV DS, BX MOV AL, [0]
需要注意的是,不能将段地址直接送入DS中,而需要先将段地址的值保存如通用寄存器,再通过通用寄存器传送到DS。
以下汇编语句表示向10000H中写入数据:
MOV BX, 1000 MOV DS, BX MOV [0], AL
字的传送:
对于8086等16位CPU,只要在mov等指令中操作16为的寄存器就可以自动识别进行16位数据传送,其中高8位数据存入高地址,低8位数据存入低地址。
汇编指令:
mov、add和sub指令均为两个参数的操作指令。指令操作完成后,结果保存在前面一个操作数中。
栈的概念:
栈在数据结构中是最基本的概念之一,在这里简单描述一下即可:一种只有一个操作点的存储空间,最先存入该存储空间的最后退出,而最后进入的最先退出,即FILO(First In Last Out)规则。
8086中的栈:
提供了push和pop指令,分别用于入栈和出栈操作。栈的每一个操作单元都是2个字节的,16位的数据。sp的范围为0-FFFF,因此栈的最大容量为64k。
实现的方法则是使用了两个寄存器SS和SP,分别作为栈寄存器和段偏移寄存器。这两个寄存器分别用于存放栈顶的段地址和偏移地址。在任意时刻,SS:SP指向栈顶的元素(当栈是空的时候,指向栈底更下一字节的位置)。通常,作为栈的一段内存首先从高地址开始存放数据,由高地址存放至低地址。
执行push指令时,首先改变sp的值,然后向ss:sp传送数据;执行pop指令时,首先从ss:sp处读取数据,然后改变sp的值。