鱼C论坛

 找回密码
 立即注册
查看: 24536|回复: 3

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

[复制链接]
发表于 2012-10-17 10:12:07 | 显示全部楼层 |阅读模式
5鱼币
各位汇编高手帮帮忙~~

汇编指令中,伪指令  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段相连”请问,相连又是什么意思?相连后不能赋值又有什么意义呢?

编译器是如何处理这一段伪指令的?

希望各位高手针对我以上问题给我做一个详细的解答,谢谢!

最佳答案

查看完整内容

为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器; ES(Extra Segment):附加段寄存器。 当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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 作用就是找到它的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-18 09:11:45 | 显示全部楼层
指定代码段到段寄存器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-18 19:02:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 14:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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