中易网

汇编伪指令assume cs:code,ds:data,ss:stack的含义

答案:1  悬赏:0  
解决时间 2021-01-13 22:38
  • 提问者网友:玫瑰园
  • 2021-01-13 12:00
汇编伪指令assume cs:code,ds:data,ss:stack的含义
最佳答案
  • 二级知识专家网友:詩光轨車
  • 2021-01-13 12:11
问题①:
你的程序中,可以用十个八个段,比如段名 D1,D2,D3,D4,D5,D6,……
8086/8088 CPU的设计,是任一时刻,只能通过4个段寄存器最多同时访问4个段。

那么问题来了:
某个段(比如D5段)与哪个段寄存器关联、用哪个段寄存器访问呢?

assume伪指令就是用来解决这个问题的。
你 assumeES:D5 以后,就将程序中的D5段与ES段寄存器绑定了,汇编程序能知道,访问D5段中的变量,要用ES作为段寄存器。

问题②:

DOS操作系统的程序装入功能,是这样设计的:
装入exe文件时,根据exe文件头中的信息,将CS:IP指向装入后内存中程序的入口(第一条执行指令),也就是说,要在装入程序时设置CS, IP两个寄存器。
对于其它3个段寄存器,DOS装入功能的处理,是将它们指向DOS操作系统为管理程序内存而创建的程序段前缀PSP的段地址。

那么问题来了:
程序运行后,要访问程序中的某个段里的数据,怎么办呢?

答案当然就是需要你自己在程序中加入将段地址传送到段寄存器的指令啦。

最后提一下,assume是给汇编程序在汇编翻译源程序时用的,段寄存器(CS除外)要自己设置初值是DOS操作系统的功能要求你程序这么做的。
追问:"assumeES:D5 以后,就将程序中的D5段与ES段寄存器绑定了"

这个“绑定”的意思是:如果用其他段寄存器比如DS:[bx]访问D5段,程序就会报错吗?
追答:举个例子吧:
假设,在D5段中有一个变量x02,你程序中某处有一条指令 movax, x02

若没有assume,汇编这条mov指令时,汇编程序会报错。因为不知道用哪个段寄存器。
有assume,汇编结果是 movax, es:[(x02的偏移地址)],因为你assume告诉了汇编程序这个段用的是es这个段寄存器
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息