2.2.8 跨段问题
2.2.8 跨段问题
8086/8088的存储器是分段使用的。通常,若选用寄存器BP作间址寄存器、变址寄存器或基址寄存器,即在采用寄存器间接寻址、变址寻址或基址加变址寻址时,只要BP出现在方括号之内,则操作数在当前堆栈段。此时,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加形成;否则,操作数在当前数据段,此时,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移地址EA相加形成。这是8086/8088的基本约定,即默认状态。当要否定默认状态,到非约定段寻址操作数时,必须用跨段前缀指明操作数所在段的段寄存器名。
汇编格式:段寄存器名:
功能:冒号“:”之前的段寄存器指明了操作数所在段。
例如:
(1)MOV AX,DS:[BP]
(2)MOV BX,ES:[BX]
(3)MOV CX,SS:[SI]
(4)MOV DX,SS:[DI]
其中,DS:、ES:、SS:均为跨段前缀。此时,默认状态不起作用,所以,操作数的物理地址由“:”前面的段寄存器内容左移4位与偏移地址EA相加形成。按跨段前缀的说明,上述4条指令的源操作数物理地址分别如下计算:
第(1)条:(DS)左移4位+[BP]
第(2)条:(ES)左移4位+[BX]
第(3)条:(SS)左移4位+[SI]
第(4)条:(SS)左移4位+[DI]
假定删去上述指令中的跨段前缀(DS:、ES:、SS:),则按默认状态确定操作数所在的段。此时,第(1)条的源操作数在堆栈段,第(2)~(4)条的源操作数在DS所指的数据段。
需要说明的是:无论是段默认状态,还是跨段情况,操作数的物理地址PA均由系统自动计算。所以,在实际应用中,当要访问某段中某一存储单元时,着重考虑的不是其物理地址的计算方法及结果,而是其类型及偏移地址的表示形式。因此,从本章之后,我们谈到的存储单元地址均是指偏移地址。