前言
参考书籍:
王爽。汇编语言。北京:清华大学出版社, 2013:48-67
本人菜狗一枚,不敢咬文嚼字,只能站在巨人的肩膀上窥探一下未曾了解的世界。
一、DS 和 [address]
DS 寄存器存放要访问数据的段地址。
将内存单元中的内容送入一个寄存器中:mov 寄存器名, [内存单元地址]。
需要使用其余寄存器作为中转来修改 ds 寄存器。
mov bx, 1000H
mov ds, bx
mov [0], al
二、mov、add、sub 指令
指令形式(以 mov 举例) | 举例 |
---|---|
mov 寄存器,数据 | mov ax, 8 |
mov 寄存器,寄存器 | mov ax, bx |
mov 寄存器,段寄存器 | mov ax, ds |
mov 寄存器,内存单元 | mov ax, [0] |
mov 内存单元,寄存器 | mov [0], ax |
mov 内存单元,段寄存器 | mov [0], ds |
mov 段寄存器,寄存器 | mov ds, ax |
mov 段寄存器,内存单元 | mov ds, [0] |
三、栈
栈是一种具有特殊的访问方式的存储空间,最后进入空间的数据,最先出去,先进后出。
8086CPU 的入栈出栈操作都是以字为单位。
8086CPU 并不会检测对栈操作是否超界,需自己注意栈满入栈超界和栈空出栈超界问题。
SS:SP(指向栈顶元素)
任意时刻,进行入栈和出栈操作时,CPU 从 SS 和 SP 中得到栈顶的地址。
push(入栈)
push ax 表示将寄存器 ax 中的数据送入栈中。
先改变 SP,后向 SS:SP 处传送。
- SP = SP - 2,SS:SP 指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶。
- 将 ax 中的内容送入 SS:SP 指向的内存单元处,SS:SP 此时指向新栈顶
8086CPU 入栈时,栈顶从高地址向低地址方向增长。
pop(出栈)
pop ax 表示从栈顶取出数据送入 ax。
先读取 SS:SP处的数据,后改变 SP。
- 将 SS:SP 指向的内存单元处的数据送入 ax 中。
- SP = SP + 2,SS:SP 指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
8086CPU 出栈时,原栈顶单元地址中的数据虽不在栈中,但依然存在。待再次入栈时,将被覆盖。
push 和 pop 指令格式
汇编指令 | 语法描述 |
---|---|
push 寄存器 | 将一个寄存器中的数据入栈 |
pop 寄存器 | 出栈,用一个寄存器接收出栈的数据 |
push 段寄存器 | 将一个段寄存器中的数据入栈 |
pop 段寄存器 | 出栈,用一个段寄存器接收出栈的数据 |
push 内存单元 | 将一个内存字单元处的字入栈 |
pop 内存单元 | 出栈,用一个内存字单元接收出栈的数据 |