汇编
寄存器和内存访问部分。
字的存储
- CPU中,用16位的寄存器来存储一个字
- 寄存器的高8位(高位单元)存放字的高位字节,寄存器的低8位(低位单元)存储字的低位字节
- 由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放
- 字单元,即存放一个字型数据的内存单元,由两个地址连续的内存单元组成
DS和[address]
- CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址
- 8086PC中,内存单元由段地址+偏移地址组成
- 8080CPU中,DS寄存器通常用来存放要访问数据的段地址
mov bx,1000H
,mov ds,bx
,mov al,[0]
- 其中,[0]表示一个内存单元,0表示内存单元的偏移地址
- 但是只有偏移地址没用段地址,是无法定位一个内存单元的
- 其实,执行指令时,8086CPU自动取ds寄存器中的数据为内存单元的段地址
- 8086CPU不支持将数据直接送入段寄存器的操作
- 所以,类似
mov ds,1000H
这样的操作是非法的 - 因而,需要一个通用寄存器来中转,如
mov bx,1000H
,mov ds,bx
- 所以,类似
字的传送
- 8086CPU是16位机构,有16根数据线,可以一次传送16位的数据
- 也就是说,可以一次传送一个字
访问数据段中的数据
- 将一段内存当作数据段
- 用ds存放数据段的段地址
- 根据需要,用相关指令访问数据段中的具体单元
栈
- 栈是一种具有特殊的访问方式的存储空间
- 特殊之处在于,最后进入这个空间的数据,最先出去
- 从程序化的角度,应该有一个标记一直指示着栈顶
CPU提供的栈机制
- 8086CPU提供相应的指令来以栈的方式访问内存空间
- 基于8086编程的时候,可以将一段内存当作栈来使用
- 8086CPU提供入栈和出栈指令
- push是入栈
- pop是出栈
- 8086CPU的入栈和出栈操作都是以字为单元进行的
- 8086CPU中,有两个寄存器用来标记栈顶位置
- 段寄存器SS存放栈顶的段地址
- 寄存器SP存放对应的偏移地址
- 任意时刻,SS:SP指向栈顶元素
- 而push和pop指令执行时,CPU从SS:SP中得到栈顶的位置
栈顶越界的问题
- 8086CPU用SS和SP来指示栈顶的位置,并提供了push和pop命令来实现入栈和出栈操作
- 那么如何保证入栈出栈时,栈顶不会超出栈空间?
- 当栈满或栈空的时候,再使用push或pop指令,都将发生栈顶越界问题
- 8086CPU中并没有可以记录栈顶上限和栈底下限的寄存器
- 我们要自己操心栈顶越界的问题
push和pop
- 这两个指令是可以在寄存器和内存之间传送数据的
push 寄存器
push 段寄存器
push 内存单元
栈段
- 将一段内存当作栈段,仅仅是我们编程时的一种安排,CPU并不会由于这种安排,就在执行push和pop指令时就将自动将我们定义的栈段当作栈空间来访问
指令功能
mov
- 将数据直接送入寄存器
- 将一个寄存器的内容送入另一个寄存器
mov 寄存器 数据
mov 寄存器 寄存器
mov 寄存器 内存单元
mov 内存单元 寄存器
mov 段寄存器 寄存器
mov 段寄存器 内存单元
mov 寄存器 段寄存器
add
- 和mov类似
sub
- 和mov类似
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ X86_64汇编学习记述四08/09
- ♥ 基础知识03/22
- ♥ 汇编记述三08/07
- ♥ x86_64汇编学习记述二08/07
- ♥ 汇编记述二08/07
- ♥ 寄存器03/27