+ -
当前位置:首页 → 问答吧 → [理解语句]代码段寄存器赋值问题

[理解语句]代码段寄存器赋值问题

时间:2010-11-21

来源:互联网

代码段寄存器不能由程序员在源程序中对其赋值,其值是由操作系统在装入它进入系统运行时自动赋值的。

这句话是怎么理解的?

我们不是可以通过mov来实现寄存器的赋值吗?

那除了代码段寄存器不可以由程序员在源程序中赋值外,数据段可以吗,堆栈段可以吗?

作者: kartik   发布时间: 2010-11-21

Assembly code
代码段寄存器不能由程序员在源程序中对其赋值,其值是由操作系统在装入它进入系统运行时自动赋值的。


因为程序员不知道那一块内存是freedom的……在没有OS之前,指令被程序员手工编译后总是从地址0开始存放,操作系统管理内存后情况就变的复杂了,程序不能从0开始存放,这意味着程序的地址绑定从编译时延迟到了加载时。

Assembly code
我们不是可以通过mov来实现寄存器的赋值吗?

那除了代码段寄存器不可以由程序员在源程序中赋值外,数据段可以吗,堆栈段可以吗?


你可能想问MOV DS,AX,它确实给DS赋值了。没错,但是DATA段已经是操作系统确定的地址并存放在AX。
也许此时你也知道可用DATA段地址是10B3H,你想把它立即MOV DS,10B3H赋值给DS。但这是Intel的限制,他们考虑的可能是空间换时间的这样:MOV AX,DATA MOV DS,AX,DATA.直接修改DS太耗时了。

作者: chuleedaemon   发布时间: 2010-11-21