主题:如何把动态内存地址赋给CS:IP?
asdfning
[专家分:0] 发布于 2006-10-24 17:08:00
在c语言中用malloc函数动态分配一段地址空间,
但我想把这个地址赋给CS:IP,也就是说在c语言
中嵌入汇编,但这段汇编语言怎么编写呢?
谢谢了,大家来讨论一下,
讨论者全部给分([color=FF0000]只为调动讨论的积极性[/color])!
回复列表 (共8个回复)
沙发
asdfning [专家分:0] 发布于 2006-10-25 09:37:00
没人知道吗?
是不是确实很难办啊?
板凳
chenzep [专家分:3640] 发布于 2006-10-25 21:18:00
JMP指令,RET指令 IRET指令,只有3个指令可以改变CS:IP的值。
MALLOC函数动态分配一个空间,返回的值是分配得到的内存空间的首地址,你要想知道这个地址是多少,如下操作:
pAddr =(....)malloc(....);
printf("%ux",(unsigned int)(pAddr) );
就可以知道这个地址是多少了,"...."是要你自己补充的内容。
不过这个地址是逻辑地址,而不是真实的物理地址,真实的物理地址你是无法获得的,这个原因涉及到CPU段页式管理方面的内容,学了操作系统就了解了。
3 楼
asdfning [专家分:0] 发布于 2006-10-26 15:58:00
很详细的回答,非常感谢!
其实这个问题是从另一个问题延伸出来的。
我把一个程序装入自己分配的内存空间中,然后想让这个程序执行起来,
所以也就想到这个办法,但如果这个办法行不通那还有什么办法可以达到
目的吗?(放入所分配内存中的数据是机器可直接执行的二进制机器码!)
谢谢了!
4 楼
chenzep [专家分:3640] 发布于 2006-10-26 19:18:00
在现代的操作系统下,你的问题应该是不能解决的.
因为现代的操作系统对数据区和代码区进行了保护:数据区不能执行,代码区不能写....
而molloc分配是数据区的空间,是不能执行的.
但是如果在DOS下,你获得的地址是物理地址,系统也没有对数据和代码进行保护,所以通过一个简单的JMP指令就可以实现你的功能了.
5 楼
asdfning [专家分:0] 发布于 2006-10-26 23:12:00
很感谢,你给我一种灵感,
呵呵,
我正是在DOS下做,原本想自己写个系统,
那样的话内存的分配完全就可以由自己来
控制了,但这样以来就必然增加了开发难度,
还要去控制文件系统,所以就想偷懒,呵呵,
在DOS下去做这件工作。
现在正在写模块,已经写了几个模块了,也谢谢
大家的提醒,共同进步!
6 楼
chenzep [专家分:3640] 发布于 2006-10-26 23:53:00
写一个类DOS的操作系统还是比较简单的~
说一下你的实验平台~
大几了?
7 楼
asdfning [专家分:0] 发布于 2006-10-27 12:19:00
看什么系统了,如果写个小的还可以,
但如果写个像DOS一样的系统应该不容易吧。
文件系统总要考虑吧,这个我有点不爽,没有
太多的文件系统的知识,不知道怎么编程。
自己写系统有个好处就是内存可以完全由自己
分配,我也想,我现在先把这个东西做出来测试了
再说吧,做完再写个系统。
对了,能否把你写系统的思路说一下呢?谢谢!
8 楼
chenzep [专家分:3640] 发布于 2006-10-27 14:17:00
先按照你自己的思路去写把,刚开始学的时候有了别人的思路是很容易受到影响的.
要说明一点的是:如果你的代码涉及到数据,注意一个重定位的问题.
我来回复