自学王爽老师《汇编语言》笔记——第3章 寄存器(内存访问)
第3章 寄存器(内存访问)
3.1 内存中字的存储
- CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。
- 内存单元是字节单元,一个字要用两个地址连续的内存单元来存放。
- 字单元:存放一个字的内存单元,由两个字节单元组成。
- 高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。
- 任何两个地址连续的内存单元都可以将它们看成一个字单元。
3.2 DS和[address]
- 8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。
- mov指令
- 将数据直接送入寄存器
- 将一个寄存器中的内容送入另一个寄存器
- 将一个内存单元中的内容送入一个寄存器中
- 格式:mov 寄存器名,内存单元地址
- [...]表示一个内存单元,[]中的数字表示内存单元的偏移地址,段地址在ds寄存器中。
- 8086CPU不支持将数据直接送入段寄存器的操作。 必须通过一个寄存器来进行中转。
3.3 字的传送
- 8086CPU是16位结构,有16根数据线,所以可以一次性传送16位的数据,即可以一次性传送一个字。
- 在mov指令中给出16位的寄存器就可以进行16位数据的传送了。
3.4 mov、add、sub指令
mov、add、sub指令形式:
mov指令 | add指令 | sub指令 | 参数 |
---|---|---|---|
√ | √ | √ | 寄存器,数据 |
√ | √ | √ | 寄存器,寄存器 |
√ | √ | √ | 寄存器,内存单元 |
√ | √ | √ | 内存单元,寄存器 |
√ | ❌ | ❌ | 段寄存器,寄存器 |
√ | ❌ | ❌ | 寄存器,段寄存器 |
3.5 数据段
我们可以将一组长度为 N(N <= 64K) 、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
3.6 栈
- 栈是一种具有特殊访问方式的存储空间。特殊性在于最后进入这个空间的数据,最先出去。
- 从程序化的角度来讲,应该有一个标记,这个标记一直指示栈顶。
- 栈有两个基本操作:入栈和出栈
3.7 CPU提供的栈机制
- 8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈)。
- 字型数据用两个单元存放,高地址单元存放高8位,低地址单元存放低8位。
- 栈顶的段地址存放在SS中,偏移地址存放在SP中。
- 任意时刻,SS:SP指向栈顶元素。
- 8086CPU中,入栈时,栈顶从高地址向低地址方向增长。
- SP = SP - 2
- 将寄存器中的内容压入SS:SP指向的内存单元处。
- 由于 “任意时刻,SS:SP指向栈顶元素”,所以当栈为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP指向栈的最底部单元下面的单元。
- pop指令执行
- 将SS:SP指向的内存单元的数据传入寄存器中。
- SP = SP + 2
3.8 栈顶超界的问题
8086CPU不保证我们对栈的操作不会越界。
3.9 push、pop指令
push和pop指令形式:
push | pop | 参数 |
---|---|---|
√ | √ | 寄存器 |
√ | √ | 段寄存器 |
√ | √ | 内存单元 |
- 栈顶的变化范围最大为:0~FFFFH。
3.10 栈 段
- 我们可以将长度为N(N <= 64KB)的一组地址连续、起始地址为16的倍数的内存单元,当作栈空间来使用,从而定义了一个栈段。
- 将一段内存当作栈段,仅仅是我们在编程时的一种安排。
实验2 用机器指令和汇编指令编程
Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧跟着被执行。
#汇编语言##自学##读书笔记#