NoteDeep
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寄存器的指令时, 下一条指令会被紧接着执行











评论列表

    内存中字的存储
    DS和[address]
    字的传送
    mov、add、sub指令
    数据段
    栈顶超界的问题
    push、pop指令
    栈段
    实验二