第三章 寄存器(内存访问)
1 内存中字的存储
add 和 sub 指令同 mov 一样,都有两个操作对象。
add 寄存器, 数据 如:add ax, 8
add 寄存器, 寄存器 如:add bx, ax
add 寄存器, 内存单元 如:add ax, [0]
add 内存单元, 寄存器 如:add [0], ax
sub 寄存器, 数据 如:sub ax, 8
sub 寄存器, 寄存器 如:sub bx, ax
sub 寄存器, 内存单元 如:sub ax, [0]
sub 内存单元, 寄存器 如:sub [0], ax
5 数据
8086PC机,我们可以根据需要将一组内存单元定义为一个段。我们可以将一组长度为N(N<=64K)、地址连续、起始地址为16的倍数的内存单元,当作专门存储数据的内存空间,从而定义了一个数据段。
如何访问数据段中的数据呢?将一段内存当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候,用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
6 栈
栈顶的元素总是最后入栈,需要出栈时,又最先从栈中取出。
7 CPU提供的栈机制
现今的CPU中都有栈的设计。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。
段寄存器SS 存放栈顶的段地址,寄存器SP 存放栈顶的偏移地址。任意时刻,SS:SP 指向栈顶元素。
8 栈顶超界的问题
栈顶越界是危险的:因为我们既然将一段空间安排为栈,那么在栈空间之外的空间里很可能存放了具有其它用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。
我们在编程的时候要自己操心栈顶越界问题,要根据可能用到的最大栈空间来安排栈的大小,防止入栈的数据太多而导致的越界。执行出栈操作的时候也要注意,以防止栈空的时候继续出栈而导致的越界。
9 push,pop指令
push和pop指令是可以在寄存器和内存之间传送数据的。
push和pop指令的格式(1)
push 寄存器 将一个寄存器中的数据入栈
pop 寄存器 出栈,用一个寄存器接收出栈的数据
push和pop指令的格式(2)
push 段寄存器 将一个段寄存器中的数据入栈
pop 段寄存器 出栈,用一个段寄存器接收出栈的数据