寄存器(内存访问02)

mov 指令

mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器

数据段

我们可以根据需要将一组内存单元定义为一个段。
我们可以将一组长度为N(N<=64k)、地址连续、起始地址为16的倍数的内存单元当做为专门存储数据的内存空间,从而定义了一个数据段。

mov指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。

[add] 表示一个偏移地址为add的内存单元。

在内存和寄存器之间传送字型数据的时候,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。

mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

栈是一种具有特殊的访问方式的存储空间,他的特殊性就在与先进的后出,后进的先出。

栈的两个基本的操作:入栈还有出栈。
8086CPU中提供的入栈还有出栈的操作。
PUSH ax:将寄存器ax中的数据送入栈中。
POP ax: 从栈顶取出数据送入ax中。
8086CPU中的入栈和出栈操作都是以字为单位进行的。

CPU如何指导当前要执行的指令所在的位置?
因为:寄存器CS和IP中存放着当前指令的段地址和偏移地址。

8086CPU中,有两个寄存器;
段寄存器SS 存放栈顶的段地址
寄存器SP 存放栈顶的偏移地址
任意时刻,SS和SP指向栈顶元素。

执行PUS的时候,sp偏移地址-2

pop ax的过程

(1)将SS:SP指向的内存单元处的数据送入ax中
(2)SP = SP+2,SS:SP指向当前的栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

栈顶越界的问题

SS和SP 只是记录了栈顶的地址,当栈顶越界的时候是非常危险的,栈顶溢出,溢出攻击。

我们既然将一段空间安排为栈,那么在栈空间之外的空间里面很可能是存放有其他用途的数据,代码等。将这些数据,代码意外地改写,将会引发一连串的错误。
CPU可以解决这个问题。

栈与内存

栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。

PUSH/POP 寄存器dx、段寄存器ds、内存单元[0]

0607