鱼C论坛

 找回密码
 立即注册
查看: 2823|回复: 0

[学习笔记] 汇编语言 - 第2章 寄存器

[复制链接]
发表于 2019-9-21 19:47:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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指向的就是堆栈段。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 08:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表