段的概念
内存没有分段,段的划分来自CPU。
在编程时可以根据需要,将若干地址连续的内存单元看作一个段。
8086CPU可将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。(其为16位CPU)
段寄存器
CS&IP
CS为代码段寄存器;IP为指令指针寄存器;
寄存器与指令关系:8086机中,任意时刻,CPU将CS:IP指向内容当做指令执行
修改CS、IP的指令
最简单修改CS、IP的指令:jmp
指令。
-
同时修改CS、IP的内容:
jmp 段地址:偏移地址
。如:jmp 2ae3:3
:CS=2ae3h、IP=0003h,CPU将从2ae33H读取指令 -
仅修改IP内容:
jmp 某一合法寄存器
。如:jmp ax
:执行指令前 ax=1000H,CS=2000H,IP=0003H。执行指令后:AX=1000H,CS=2000H,IP=1000H
代码段
可根据需要将一组内存单元定义为一个段。将长度N(<=64kb(对于8086))的一组代码,存在一组地址连续、起始地址为16倍数的内存单元中。
要让CPU执行代码段,必须将CS:IP指向所定义的代码段的第一条指令的首地址,CPU只认被CS:IP指向的内存单元的中的内容为指令。
Debug
R命令
查看、改变CPU寄存器的内容
-
r
查看寄存器内容 -
r [寄存器名]
修改寄存器内容
D命令
查看内存中内容
-
d [段地址]:[偏移地址]
。列出指定内存单元开始的128个内存单元的内容;每行16个。右侧为对应可现实的ASCII码字符,若无则显示
.
-
d [段地址]:[偏移地址] [结尾偏移地址]
。列出指定内存单元开始的指定个数内存单元的内容
E命令
改写内存中的内容
-
e [起始地址] [*数据组]
写入数值
写入字符串
写入机器码
-
e [起始地址]
。问答式修改方式
U命令
将内存单元中的内容翻译为汇编指令显示
-
u [起始地址]
T命令
执行一条或多条指令;若用T命令控制CPU执行我们写的指令,确保CS:IP指向了对应的内存单元。
A命令
用Debug的A命令以汇编指令的形式在内存中写入机器指令
-
a [起始地址]
寄存器(内存访问)
内存中字的存储
字单元:存放一个字符型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。
起始地址为N的字单元简称为N地址字单元。
地址单元:一个内存单元;地址字单元:两个内存单元;
DS&[address]
段地址默认存放在ds寄存器
DS是CPU中的一个寄存器;存放要访问数据的段地址;不能使用mov
直接传入段地址,需要传入一个寄存器获取寄存器的段地址;
读取内存:
写入内存:
字的传送
8086CPU是16位结构,有16根数据线,可以一次传送16位数据,即一次性传送一个字。
mov、add、sub指令
除了以上几种还有诸如mov 段寄存器,寄存器
、mov 内存单元,寄存器
、mov 段寄存器,内存单元
(同上说明)
数据段
前文提及,可根据需要将一组内存单元定义一个段,将一组长度为N、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,称为数据段。
# 累加数据段中的前3个字型数据
mov ax,123bh
mov ds,ax
mov ax,0
add ax,[0]
add ax,[1]
add ax,[2]
add ax,[4]
栈
栈是一个种距有特殊的访问方式的存储空间,先进后出。
CPU提供的栈机制
8086CPU提供入栈和出栈指令,最基本两个是push(入栈)
和pop(出栈)
。出入栈操作都是以字为单位。
字型数据用两个单元存放,高地址单元存放高8位,低地址单元存放低8位
8086CPU中的段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。
入栈时,栈顶从高地址向低地址方向增长,即sp=sp-2。
当栈为空的时候,SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2
pop出栈之后原栈顶数据依然存在,但不在栈中;如果push入栈原栈顶会被覆盖
栈顶超界问题
push、pop指令
-
push指令的执行步骤:1.SP=SP-2 2.向SS:SP指向的字单元送入数据
pop指令的执行步骤:1.从SS:SP指向的字单元中读取数据 2.SP=SP+2
-
栈空间是内存空间的一部分。
-
push、pop可以在寄存器和内存:
push 寄存器;将一个寄存器中的数据入栈
、pop 寄存器;出栈,用一个寄存器接收出栈的数据
push、pop可以在段寄存器和内存:
push 段寄存器;将一个段寄存器中的数据入栈
、pop 段寄存器;出栈,用一个段寄存器接收出栈的数据
push、pop可以在内存和内存:
push 内存单元;将一个内存字单元出的字入栈
、pop 内存单元;出栈,用一个内存字单元接收出栈数据
栈段
可根据需要将一组内存单元定义为一个段,也可将长度为n(n小于64kb)的一组地址连续、起始地址为16倍数的内存空间当做栈空间使用,以栈的方式访问,这段空间称为栈段
实验二
-
D、E、A、U命令可以使用
d 段寄存器:偏移地址
-
单步运行t在某些情况下会不止运行一行命令,如
mov ss,ax mov sp,10