第三章寄存器(内存访问)
3.1 内存中字的存储
CPU中,用16位寄存器来存储一个字,高8位存放高位字节,低8位存放低位字节。
一个字要用两个地址连续的内存单元来存放。低位字节存放在低地址单元(不是低8位)中,高位字节存放在高地址单元中。
字单元:存放一个字型数据的内存单元。由两个连续的内存单元组成。
起始地址为N的字单元简称N地址字单元。起始地址为低地址单元。
任何两个地址连续的内存单元,N单元和N+1单元,可以将他们看成两个内存单元也可以一个起始地址为N的字单元中的低位字节单元和高位字节单元。
3.2 DS和[address]
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址。
DS寄存器用来存放要访问数据的段地址。
mov的三种传送:(1)将数据直接送入寄存器
(2)将寄存器中的内容送入寄存器-------用寄存器名指明
(3)将一个内存单元中的内容送入寄存器-------用内存单元的地址指明
[]中的数值用来表示内存单元的偏移地址。
指令执行时,CPU自动取DS中的数据为内存单元的段地址。
8086CPU不支持将数据直接送入段寄存器。只能用一个寄存器来进行中转。
3.3 字的传送
8086CPU可以一次性传送16位数据,也就是说可以一次性传送一个字。
在mov指令中给出16位的寄存器就可以进行16位数据的传送。
3.4 mov、add、sub指令
mov可以进行的指令:
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器
mov 内存地址,段寄存器
mov 段寄存器,内存地址
数据能传输就说明硬件之间存在这方向的通路。
3.5 数据段
访问数据段中的内容:用ds存放数据段的段地址,用偏移地址访问数据段中的具体单元。
3.6 栈
栈是一种具有特殊的访问方式的存储空间。
栈的两个基本操作:入栈和出栈。
LIFO(LAST IN FIRST OUT)
3.7 CPU提供的栈机制
所有CPU都提供了栈的设计。
8086CPU提供相关的指令来以栈的方式访问内存空间。
入栈的指令:PUSH
push ax表示把ax中的数据送入栈中
出栈的指令:POP
pop ax表示从栈顶取出栈顶元素送入ax中
8086CPU的入栈和出栈都是以字为单位进行的。
栈顶的段地址存放在SS中,偏移地址存放在SP中,任意时刻SS:SP指向栈顶元素。
入栈时,栈顶从高地址向低地址方向增长。
当栈为空时,SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2。(最后偏移地址+1)
3.8 栈顶超界的问题
当栈满的时候使用push,栈空的时候使用pop都会发生栈顶超界。
8086CPU不会保证我们对栈的操作不会超界。
过度push的后果:栈顶指针指向正常栈顶-2的内存并覆盖栈外数据。
过度pop的后果:栈顶指针指向正常栈顶+2的内存,如果这时push并不会入栈而是覆盖指针此时所指的内存地址中的数据。
3.9 push、pop指令
push和pop指令格式:
push/pop 寄存器
push/pop 段寄存器
push/pop 内存地址 段地址从ds中获得
寄存器清零的两个方法:sub自减(占两个字节的机器码),mov赋值(占3个字节的机器码)
用栈来暂存以后需要恢复的寄存器中的内容时,出栈的顺序要和入栈的顺序相反。
不使用mov内存单元,寄存器指令向某一内存单元写入数据的方法:栈
执行push的时候:sp先自减然后再送入数据,注意顺序。
执行pop的时候:CPU先读取SS:SP处的数据,后改变SP。
push/pop的操作只修改SP,所以栈顶的变化范围最大为:0-FFFFH
8086提供的栈操作机制:SS、SP指示栈顶,改变SP后写内存的入栈指令,读内存后改变SP的出栈指令。
3.10 栈段
将一段内存空间当作栈来用,以栈的方式访问,这段空间就可以称为一个栈段。
访问栈段的方法:将SS:SP指向定义的栈段(SS:SP为段尾地址+1)
一个栈段的容量最大为64KB。