三、寄存器(内存访问)
p59
内存中字的存储
1字 = 2字节
高位高地址, 低位低地址 小端模式
DS和[address]
CPU要读取一个内存单元时, 必须先给出内存单元的地址
8086CPU中, 内存地址由段地址和偏移地址组成
8086CPU有一个DS段寄存器, 通常用来存放要访问的数据的段地址
读取10000H单元的内容
mov bx, 1000H
mov ds, bx
mov al, [0]
将ds中的段地址偏移0, 赋值给al
mov al, [0]
将指定内存单元的内容赋值给寄存器
mov 寄存器名, 内存单元地址
[...] 表示内存单元的偏移地址
一定要先放入通用寄存器
mov ds, bx
mov ds, 1000H 是非法的
将al中的数据送入内存
mov bx, 1000H
mov ds, bx
mov [0], al
字的传送
8086是16位结构, 有16根数据线, 一次性可以传送16位数据, 也就是一次性一位
mov bx, 1000H
mov ds, bx
mov ax, [0] 将1000:0中的数据放入ax中
mov [0], cx 将cx中的数据放入1000:0中
p63
mov、add、sub指令
mov 寄存器, 数据
mov 寄存器, 寄存器
mov 寄存器, 内存单元
mov 内存单元, 寄存器
mov 段寄存器, 寄存器
mov 寄存器, 段寄存器
数据段
数据段的长度是16的倍数, 不超过64k
如何访问数据段种的数据
将段地址放入ds中
通过地址偏移访问
栈
栈是一种特殊访问方式的存储空间。LIFO
基本操作:入栈、出栈
CPU都有栈的设计
8086CPU提供相关的指令来以栈的方式访问内存空间
可以将一段内存当作栈来使用
8086提供入栈和出栈的指令
push ax : 将寄存器ax中的数据送入栈中
pop ax : 从栈顶取出元素送入ax
以字为单位
CPU如何直到一段内存空间被当作栈使用
段寄存器SS:存放段顶的段地址
CPU如何知道哪个单元是栈顶单元
寄存器SP:存放栈顶的偏移地址
任意时刻, SS:SP指向栈顶元素
栈的底部:栈的最大地址 - 1
栈为空时, SS:SP指向栈的最大的地址 + 1, 不存在栈顶元素
push:SS:SP向上移动一个字 - 2, 将数据放入栈内的高地址
pop:将栈顶的字取出, SS:SP向下移动一个字, + 2
栈顶超界的问题
8086CPU不保证对栈的操作不会超界
push、pop指令
pop 寄存器
pop 段寄存器
pop 内存单元 : pop [0]
push 寄存器
push 段寄存器
push 内存单元
栈段
在编程时, 可以根据需要, 将一组内存单元定义为一个段
可以将长度为N(N <= 64k)的一组地址连续, 起始地址为16的倍数的内存单元当作栈来用
P82
实验二
debug在执行修改ss寄存器的指令时, 下一条指令会被紧接着执行