第三章 寄存器知识总结
内存中字的存储
用16位寄存器来存储一个字,一个字要用两个地址连续的内存单元来存放(一个单元存放一个字节),⚠️其顺序是高-高,低-低,即小端法。
字单元概念:即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节,取低地址内存单元地址为字数据地址。
n地址字单元:起始地址为n的字单元。
ds和【address】
ds:存放要访问数据的段地址。
mov指令的两种传送:
1.将数据直接送入寄存器(两个操作数要一样长)
2.将一个寄存器的内容送入另一个寄存器
3.将一个内存单元中的内容送入一个寄存器中:mov 寄存器名,内存单元地址。(两个内存单元之间不能直接传送数据。)
⚠️8086cpu不支持将数据直接送入段寄存器的操作。只好用一个寄存器进行中转。
mov,add,sub指令
⚠️在mov, add, sub等汇编指令中,访问内存单元时,默认情况下,指的是数据段。
mov指令有如下三种形式:
(1)mov 寄存器,段寄存器
(2)mov 内存单元,段寄存器
(3)mov 段寄存器,内存单元
栈 (SS) × 16 + (SP) → 栈顶的物理地址
栈是一种具有特殊的访问方式的储存空间。
特殊型:最后进入这个空间的数据,最先出去。后进先出
两个基本操作:
入栈:将一个新的元素放到栈顶。
出栈:从栈顶取一个元素。
cpu提供的栈机制
最基本的两个指令:(都是以字为单位进行的;操作对象不能是常数)
PUSH(入栈)
POP(出栈)
段寄存器ss,sp
ss:栈顶的段地址存放在其中
sp:偏移地址存放在其中
任何时刻ss:ip指向栈顶元素。cpu从ss,sp中得到栈顶的地址。
入栈(push)步骤:
(1)sp=sp-2,ss:sp指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶。
(2)将寄存器中的内容送入ss:sp指向的内存单元处,ss:sp指向新栈顶。
出栈(pop)步骤:ss:sp指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
(1)将ss:sp指向的内存单元处的数据送入ax中。
(2)sp=sp+2,
⚠️栈空时,ss:sp指向栈空间最高地址单元的下一个单元。
⚠️出栈的内存仍然存在,只是不在栈中。
栈顶超界的问题:
超出了栈空间,其他内存将被覆盖。8086cpu不保证我们对栈的操作不会超界。因此我们在编程的时候要自己操心栈顶超界的问题。
push,pop指令
格式:push:寄存器,段寄存器,内存单元(让数据入栈)。
pop :寄存器,段寄存器,内存单元(接收出栈的数据)。
⚠️不能直接向段寄存器ss中送入地址。
point:
push和pop指令访问的内存单元的地址不是在指令中给出的,是由ss:sp指出的。
Push,pop等栈操作指令,修改的只是sp。栈顶的变化范围最大为0~ffffh。因此,一个栈段的最大容量为64kb。