回 帖 发 新 帖 刷新版面

主题:如何把动态内存地址赋给CS:IP?

在c语言中用malloc函数动态分配一段地址空间,
但我想把这个地址赋给CS:IP,也就是说在c语言
中嵌入汇编,但这段汇编语言怎么编写呢?

谢谢了,大家来讨论一下,
讨论者全部给分([color=FF0000]只为调动讨论的积极性[/color])!

回复列表 (共8个回复)

沙发

没人知道吗?

是不是确实很难办啊?

板凳

JMP指令,RET指令 IRET指令,只有3个指令可以改变CS:IP的值。
MALLOC函数动态分配一个空间,返回的值是分配得到的内存空间的首地址,你要想知道这个地址是多少,如下操作:
pAddr =(....)malloc(....);
printf("%ux",(unsigned int)(pAddr) );
就可以知道这个地址是多少了,"...."是要你自己补充的内容。
不过这个地址是逻辑地址,而不是真实的物理地址,真实的物理地址你是无法获得的,这个原因涉及到CPU段页式管理方面的内容,学了操作系统就了解了。

3 楼

很详细的回答,非常感谢!

其实这个问题是从另一个问题延伸出来的。

我把一个程序装入自己分配的内存空间中,然后想让这个程序执行起来,
所以也就想到这个办法,但如果这个办法行不通那还有什么办法可以达到
目的吗?(放入所分配内存中的数据是机器可直接执行的二进制机器码!)

谢谢了!

4 楼

在现代的操作系统下,你的问题应该是不能解决的.
因为现代的操作系统对数据区和代码区进行了保护:数据区不能执行,代码区不能写....
而molloc分配是数据区的空间,是不能执行的.
但是如果在DOS下,你获得的地址是物理地址,系统也没有对数据和代码进行保护,所以通过一个简单的JMP指令就可以实现你的功能了.

5 楼

很感谢,你给我一种灵感,
呵呵,
我正是在DOS下做,原本想自己写个系统,
那样的话内存的分配完全就可以由自己来
控制了,但这样以来就必然增加了开发难度,
还要去控制文件系统,所以就想偷懒,呵呵,
在DOS下去做这件工作。

现在正在写模块,已经写了几个模块了,也谢谢
大家的提醒,共同进步!

6 楼

写一个类DOS的操作系统还是比较简单的~
说一下你的实验平台~
大几了?

7 楼

看什么系统了,如果写个小的还可以,
但如果写个像DOS一样的系统应该不容易吧。

文件系统总要考虑吧,这个我有点不爽,没有
太多的文件系统的知识,不知道怎么编程。

自己写系统有个好处就是内存可以完全由自己
分配,我也想,我现在先把这个东西做出来测试了
再说吧,做完再写个系统。

对了,能否把你写系统的思路说一下呢?谢谢!

8 楼

先按照你自己的思路去写把,刚开始学的时候有了别人的思路是很容易受到影响的.
要说明一点的是:如果你的代码涉及到数据,注意一个重定位的问题.

我来回复

您尚未登录,请登录后再回复。点此登录或注册