蝈蝈 发表于 2012-10-17 10:12:07

谁能告诉我汇编中assume cs:code,ds:data的作用

各位汇编高手帮帮忙~~
汇编指令中,伪指令assume cs:code,ds:data   有什么用?我发现不写ds:data对程序的运行不会有任何影响,书上说段名(也就是code,data)相当于一个段地址,原本我以为ds:data 这条语句是给ds赋值,结果发现并不能给ds赋值,而且代码段中总会有:mov ax,data;mov ds,ax;通过这样的语句给ds赋值,那cs:code,ds:data岂不是没有任何用处?
并且我还在书上看到这样一句话:“assume cs:code,ds:data,ss:stack将cs,ds和ss分别与code,data,stack段相连”请问,相连又是什么意思?相连后不能赋值又有什么意义呢?
编译器是如何处理这一段伪指令的?
希望各位高手针对我以上问题给我做一个详细的解答,谢谢!

天-踏梦者 发表于 2012-10-17 10:12:08

为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。
当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。

要用assume把段跟段寄存器对应起来的原因是原来的DOS找到的空闲内存的地址不是固定的,无法找到一个地址在任何时候都是空闲的。于是DOS需要可以重定位的程序,而当时的定位方式就是设置段寄存器的值使该程序能在可分配(空闲)的内存中可用。那就需要知道某个段被重定位时候需要修改哪个段寄存器的值才能正确执行。assume提供这种段和重定位代码时需要对应修改的寄存器的关系给编译器,编译器再这个信息写到二进制文件中去。比如DOS下的exe程序记录在文件头中。

任何段寄存器都不能直接赋值 这是规定 不要管他有没有意义 你理解成C的函数声明就OK 作用就是找到它的地址

Sloth4413 发表于 2012-10-18 09:11:45

指定代码段到段寄存器

无星之夜 发表于 2012-10-18 19:02:59

天-踏梦者 发表于 2012-10-18 05:31 static/image/common/back.gif
为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段 ...

+10086。。。
页: [1]
查看完整版本: 谁能告诉我汇编中assume cs:code,ds:data的作用