操作系统实验DOS多任务分时系统,结构体struct int_regs的成员变量声明顺序问题

qq_23373117 2016-12-12 05:52:08
定义了一个结构体来表示线程的私有堆栈,其中的变量名与CPU寄存器的名字一样
struct int_regs {
unsigned bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags,off,seg;
};
接下来的程序挺长的,其中用到这个结构体的代码只有一个地方,就是对线程创建时对其私有堆栈进行初始化,代码如下:
int create(char *name,codeptr code,int stck) //name为新创建线程的外部标识符,
code为新创建线程要执行的代码入口地址
stck为新创建线程的私有堆栈的长度
{
struct int_regs far *r;
int i,id=-1;
unsigned char *ptr;

for(i=0;i<NTCB;i++){ //NTCB为系统允许的最多任务数
if(tcb[i].state==0){ //state为0表示线程处于终止状态或者TCB是空白状态
id=i;
break;
}
}
if(id==-1) return(0);

disable();

tcb[id].stack=(unsigned char *)malloc(stck);
r=(struct int_regs *)(tcb[i].stack+stck-1);
r--;
tcb[id].ss=FP_SEG(r); //得到r的段地址
tcb[id].sp=FP_OFF(r); //得到r的段内偏移
r->cs=FP_SEG(code);
r->ip=FP_OFF(code);
/*用到int_regs的就是从这里开始*/
r->ds=_DS;
r->es=_DS;
r->flags=0x200;
r->seg=FP_SEG(over);
r->off=FP_OFF(over);
tcb[id].state=READY;
for(i=0;i<10;i++,name++){
if((tcb[id].name[i]=*name)==NULL)
break;
}
tcb[id].name[9]='\0';

enable();
return(1);
}
问题来了:实验验收的时候老师问了个问题,能不能把int_regs里的变量换个位置,比如定义成:
struct int_regs {
unsigned off,seg,bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags;
};
只是把定义时的变量声明顺序改一下嘛,有什么关系,结果:程序就运行不了了
感到很是奇怪,因为这是验收,老师也不肯解答这个问题,觉得可能跟堆栈有序有关,但是只是声明变量的顺序也会影响到堆栈的具体情况吗,实在想不明白,请各位大神指点迷津
不知道放在哪个版块,就姑且放在C版块吧
...全文
231 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧