版权声明:本文为 gfson
原创文章,转载请注明出处。
注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢。
3.1 DS 和 [address]
- DS 寄存器,通常用来存放要访问的数据的段地址。
- [...] 表示内存单元的偏移地址,DS 中数据为内存单元的段地址。
3.2 mov、add、sub 指令
-
mov 指令可以有以下形式:
- mov 寄存器,数据
- mov 寄存器,寄存器
- mov 寄存器,内存单元
- mov 内存单元,寄存器
- mov 内存单元,段寄存器
- mov 段寄存器,内存单元
- mov 段寄存器,寄存器
- mov 寄存器,段寄存器
-
add、sub 有以下几种形式:
- add 寄存器,数据
- add 寄存器,寄存器
- add 寄存器,内存单元
- add 内存单元,寄存器
- sub 寄存器,数据
- sub 寄存器,寄存器
- sub 寄存器,内存单元
- sub 内存单元,寄存器
add、sub 不能对段寄存器进行操作,如
add ds,ax
是非法的。
3.3 数据段
- 将内存当作数据段。
- 用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
3.4 检测点 3.1
-
答案:
第一题:
第二题:
3.5 CPU 的栈机制
- 栈顶的段地址存放在 SS 中,偏移地址存放在 SP 中。
- 任意时刻,SS:SP 指向栈顶元素。
- push 和 pop 指令执行时,CPU 从 SS 和 SP 中获得栈顶的地址。
-
push ax 的执行:
-
pop ax 的执行:
- 栈顶超界
- 8086CPU 不保证我们对栈的操作不会超界。
- 8086CPU 只知道栈顶在何处,而不知道我们安排的栈空间有多大。
- 我们编程时,需要自己考虑栈越界的问题。
3.6 push、pop 指令
- push 和 pop 指令的格式可以如下:
- push 寄存器 ;将一个寄存器中的数据入栈
- push 段寄存器 ;将一个段寄存器中的数据入栈
- push 内存单元 ;将一个内存字单元处的字入栈(注意:栈操作都是以字为单位)
- pop 寄存器 ;出栈,用一个寄存器接收出栈的数据
- pop 段寄存器 ;出栈,用一个段寄存器接收出栈的数据
- pop 内存单元 ;出栈,用一个内存字单元接收出栈的数据
3.7 栈段
- 将内存当作栈段。
- 将 SS:SP 指向我们定义的栈段。
3.8 数据段、代码段、栈段
- 内存中到底是代码、数据还是栈,关键取决于 CPU 中寄存器的设置,即 CS、IP、SS、SP、DS 的指向。
3.9 检测点 3.2
-
答案:
3.10 实验 2
- 答案:
(1)略
(2)在使用 t 命令进行单步追踪的时候,产生了中断,为了保护现场,CPU 将 PSW、CS 和 IP 依此入栈,导致了内存相关位置内容的改变。