汇编语言 - 第2章 寄存器
本帖最后由 SВ 于 2019-9-22 10:05 编辑分段模式是8086的重点。
由于intel 8086 的寄存器是16位的,而地址总线有20位,单个16位寄存器不足以表达20位的地址总线的数据,于是产生了分段模式,即使用两个寄存器共同表达20位的地址总线的数据。
假如偏移寄存器例如IP有足够的位数20位,那么段寄存器CS就没有存在的必要了。
8086机械地遵循以下公式
物理地址 = 段地址*16+偏移地址
段地址是段寄存器中的数据,段地址*16表示一个段的起始地址。
偏移地址是保存在另外一个寄器中的数据,表示当前某一条数据/代码在段中的偏移地址。
Intel 8086是按分段模式设计的,汇编程序支持两种分段模式:
1.没有段定义语句(平坦模型):
所有二进制数据(代码,数据,堆栈)共用一个段。初始化时,代码段寄存器,数据段寄存器,堆栈段寄存器都指向这个段的起始点(假设偏移寄存器都为0)
所有地址都是整个程序中的偏移(这是一般情况,还需要根据具体汇编器来确定)
数据段初始化:mov ax,cs; mov ds,ax
堆栈段初始化:mov ax,cs; mov ss,ax
2.有的语句属于一个段,有的语句不属于一个段
所有二进制数据(代码,数据,堆栈)不共用段。初始化时(假设偏移寄存器都为0),
代码段寄存器指向初始代码段的起始点(可以有多个代码段,但程序开始时指向初始代码段)
数据段寄存器指向初始数据段的起始点(可以有多个数据段,但程序开始时指向初始数据段)
堆栈段寄存器指向初始堆栈段的起始点(可以有多个堆栈段,但程序开始时指向初始堆栈段)
属于一个段的汇编语句的地址是其所在段中的偏移,不属于一个段的汇编语句的地址是整个程序中的偏移(这是一般情况,还需要根据具体汇编器来确定)
数据段初始化:mov ax,数据段的段名; mov ds,ax
堆栈段初始化:mov ax,堆栈段的段名; mov ss,ax
还有一个重点是:CS默认与IP搭配,CS:IP指向的数据就是代码段,DS:[偏移地址]指向的就是数据段,SS:SP指向的就是堆栈段。
页:
[1]