散分(顺便也解疑):从实模式向保护模式的转换过程中,代码为16-bit与32-bit的混合体,该用什么编译器生成?UP有分!

tianxiangyuan 2004-03-26 10:41:08
从实模式向保护模式的转换过程中,代码为16-bit与32-bit的混合体,因在下的汇编语言功力有限,想结合C语言写,该使用什么编译器,怎么写代码?请大虾不吝赐教,UP有分。
...全文
33 27 打赏 收藏 举报
写回复
27 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Tiangua 2004-03-31
gz
  • 打赏
  • 举报
回复
Areslee 2004-03-31
PM就是保护模式
  • 打赏
  • 举报
回复
carehare 2004-03-31
sorry,忘了申明用C前memory(用作堆栈)必须可用,比如在SMP系统中把第2个CPU唤醒时可以很快切到保护模式并用C写。还有大家说的PM是什么意思?
  • 打赏
  • 举报
回复
WindWay 2004-03-31
水平有限,帮顶吧
  • 打赏
  • 举报
回复
Areslee 2004-03-30
生成什么样的代码要看是什么编译器,BC 3.1就只能生成16位代码
直接在PM中用就等着重启吧
  • 打赏
  • 举报
回复
tianxiangyuan 2004-03-30
to Areslee(易水) :

Linux使用的PM规则到底是什么?
  • 打赏
  • 举报
回复
carehare 2004-03-30
To Areslee:

内核可以用C,其实C编译后无非也是一些汇编代码,只不过要设好堆栈,还有通常生成的代码是32位的(也许用tiny可以生成16位代码?)
  • 打赏
  • 举报
回复
yqzq 2004-03-30
Nasm+ Tc2.0 就可以啊


  • 打赏
  • 举报
回复
ggyy2005 2004-03-30
up
  • 打赏
  • 举报
回复
sunny 2004-03-29
linux的核心的底层代码当然是汇编语言写的了!然后才是C语言写的系统周边。
在MASM中可以自己通过加上一个指令前缀来指示当前指令的读取解释方式,也可以在一个代码段中采用USER32或者USER16来表示你这个段中要求使用的读取解释方式!
其实在C中也是一样,你可以使用16位的代码对应16的汇编接口。
  • 打赏
  • 举报
回复
tianxiangyuan 2004-03-29
to Areslee(易水) :

照你这么说,像Linux这样的操作系统只能用汇编语言写了?
  • 打赏
  • 举报
回复
Areslee 2004-03-29
PM代码建议还是用汇编写吧,不然很危险的,要不也可以将段寄存器全部置为基址为0的4GB段,然后用VC写32位部分,生成汇编代码在用汇编编译器编译
  • 打赏
  • 举报
回复
zeax 2004-03-29
……关注,顺便UP
  • 打赏
  • 举报
回复
Areslee 2004-03-29
to tianxiangyuan(潇湘夜雨):
  你按LINUX内核模型写的代码就符合它的规则
to carehare(carehare):
  编译器编译时怎么知道你的代码在什么模式下运行呢?就算你能跳过去也同样会造成异常
所以32位内核部分一定要用汇编写,然后外围部分可以考虑用32位C编译器编
  • 打赏
  • 举报
回复
紫郢剑侠 2004-03-29
cmain只能采用TINY模式,不会罢?

你可以装cmain()编译在.OBJ文件,

在连接汇编语言写的代码时把这个OBJ文件一起连接进去.
  • 打赏
  • 举报
回复
carehare 2004-03-29
偶不懂什么叫TINY模式,不过既然已经在保护模式,C函数应该用普通的32位模式吧
如果编译不过,试试jmp,实在不行的可以jmp Address,(事先在这个Address中填入C函数地址)
或者这个_start先call个32bit的汇编寒暑,再call C函数试试
  • 打赏
  • 举报
回复
tianxiangyuan 2004-03-29
to Areslee(易水) :

Linux使用的PM规则是什么样的?我如何也是用这样的规则?
  • 打赏
  • 举报
回复
BuW 2004-03-29
看看,顺便UP!~~~~
  • 打赏
  • 举报
回复
Areslee 2004-03-29
LINUX有自己的编译器和文件格式,它的编译器知道它所用到的PM使用规则,但你自己的代码的规则编译器不知道,因此很可能生成引起异常的代码
  • 打赏
  • 举报
回复
tianxiangyuan 2004-03-27
首先感谢大家的帮助。各位大虾好像误解了我的意思。下面是代码的框架:

.MODEL TINY,C
.CODE
_start:
...
call cmain ;cmain为C语言写的函数,也是TINY模式,否则,无法调用
...
end _start

如果,我在调用cmain之前,将cpu转到保护模式下,再调用cmain函数时,就会出错。请问,这时的cmain函数该如何写?如何编译?
  • 打赏
  • 举报
回复
加载更多回复(7)
发帖
汇编语言

2.1w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
帖子事件
创建了帖子
2004-03-26 10:41
社区公告
暂无公告