简单指令
当我们看了寄存器的详解后,及了解算术中的变量,下面我们来看一下,在8086CPU中一些计算法则规则的讲解。
先来看一下内存中字的存储、传送。
字存储
CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。由于内存单元是以字节单位,则一个字需要两个连续的内存单元来存放。字的高低位于内存单元高低地址单元对应。先前以了解到8086CPU中内存地址有段地址和偏移地址组成,CPU在读取内容时通过内存单元访问内容,所以8086CPU中有一个DS寄存器,通常用来存储要访问的数据段地址。
例如:mov bx, 1000H mov ds,bx mov al,[0]
上例中mov 指令的作用为寄存器和内存之间进行字节型数据的传送,“[...]”表示一个内存单元,"[...]"中的0表示内存单元的偏移地址。当读取内容时CPU将自动取DS中的数据为内存单元的段地址。
我们知道8086CPU不支持将数据直接送入段寄存器,例如:mov ds,1000H。因此我们需要使用普通寄存器进行中转,以达到对DS的负责。
由于8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是说可以一次性传送1个字。只要在mov 指令中给出16位的寄存器就可以进行16位数据的传送。
指令集
mov 寄存器,数据 例如:mov ax,1000H
mov 寄存器,寄存器 例如:mov ax,bx
mov 寄存器,内存单元 例如:mov ax,[0]
mov 内存单元,寄存器 例如:mov [0],ax 从寄存器向内存单元传送数据
mov 段寄存器,寄存器 例如:mov ds,ax 从寄存器向段寄存器传送数据
数据段
此处的数据段与前面讲解的代码段意思相近,解释为将一组长度为N(N≤64KB)、地址连续、起始地址位16的倍数的内存单元当作专门存储数据的内存空间。
栈段
先来说一下栈,是一种特殊的访问方式的存储空间,特殊于遵从数据先进后出。8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈)。例如:PUSH AX表示将寄存器AX中的数据送入栈中,POP AX表示从栈顶取出数据送入AX,操作单位为字节。
数据、代码有DS、CS、IP三个寄存器,而栈段有SS、SP寄存器,任意时刻,SS:SP指向栈顶元素。PUSH和POP指令执行时,CPU从SS和SP中得到栈顶的地址。
PUSH命令:执行时将寄存器中的内容放入当前栈顶单元的上方,成为新的栈顶元素。操作步骤:①SP=SP-2②将AX中的内容送入SS:SP指向的单元处,SS:SP此时指向新栈顶。
POP命令:执行时从栈顶单元中取出数据,送入寄存器中。操作步骤:①将SS:SP指向的内存单元处的数据送入AX中,②SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
PUSH和POP指令的格式可以是如下形式:
PUSH 寄存器/段寄存器/内存单元
POP 寄存器/段寄存器/内存单元
注意
由于栈容量为16位,在执行PUSH指令后,栈顶超出栈空间是常见的情况。当然栈在没有数据的情况下,执行POP指令出栈,也会出项同样的事儿。所以在编程时要注意操作是否会超界。
在大多数情况下,栈将作为临时存放数据的首选。
代码段、数据段、栈段区别
相同之处:将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。
不同之处:①数据段存放的是数据,使用DS:IP读取②代码段存放的是代码,使用CS:IP读取③栈段使用SS:SP读取
发现说的有一点多了,希望通过这些讲解,使我们对简单指令相关的概念与用法有一个基础性的了解。
多说无用,做才是王道。