关于汇编段地址的疑惑

来源:百度知道 编辑:UC知道 时间:2024/06/04 16:14:11
段地址.本身是并不存在的吗?仅仅是在我们需要的时候自己定义的吗?
那是不是我们在每个代码的开始都必须去定义段.不然不会混淆吗?

再者..有一个数据存放在内存20000H单元中,,现给定段地址为SA.若想用偏移地址寻到此单元.则SA应该满足的条件是:最小______,最大为________
这个问题我死都没想明白..望高手给详细的解释下思路..

此问题可追加分...谢谢..

CPU将存储器空间分成许多逻辑段,每个段最大限制为64KB,段地址就是逻辑段在主存中的起始位置。
一个程序可能有数据段,代码段,堆栈段等等
要访问他们就要知道他们的段地址然后加上偏移。

来拿一个简单的例子:
比如有如下数据段
data SEGMENT
a DB 31
b DB 1
c 100 DUP (?)
data ENDS
c定义为100个空单元,可以用来放入数据
那么要得到C的地址可以
MOV AX,data ;这里就是段地址
ADD AX,02h ;偏移地址

程序分为数据段DS,代码段CS,堆栈段SS,附加段ES
每一个程序都可以分成这几个部分(有时只有数据段和代码段,甚至只有代码段)。
比如下面程序,在结构上就是一个完整的程序:
DATA SEGMENT
……
DATA ENDS

EATA SEGMENT
……
EATA ENDS

SATA SEGMENT
……
SATA ENDS

CODE SEGMENT
ASSUME DS:DATA,ES:EATA,SS:SATA

START:MOV AX,DATA
MOV DS,AX
MOV AX,EATA
MOV ES,AX
MOV AX,SATA
MOV SS,AX
……
……
……
CODE ENDS
END START

DATA,EATA,SATA都是自定义的段名字,这几个段 存在你的计算机上,因而每个段都对应一个内存地址。
我们把DATA在内存中的地址送入AX中,再从AX中送到段寄存器DS,这样程序就会“明白”你给它的数据段放在了哪里,要用到的时候它就“知道”该到哪里去找。
因此,所谓的段地址,就是DS,CS,ES,SS中的数值,也就是D