Chinaunix

标题: 裸机问题 [打印本页]

作者: zhongfangqing    时间: 2007-11-15 11:21
标题: 裸机问题
用汇编写了一段时间,感觉要疯掉了。得改用C。
因为gcc不支持编译16位的程序,所以,我打算用tc.
然后用我的引导程序把这个tc编译的可执行程序从软盘上读到内存里,jmp到tc的代码段开始位置.
但是好象tc编的东西是在内存0100h处开始执行的。但是裸机里,这个地址出还是BIOS的中断向量表啊。这可怎么办啊?
tc能指定代码段的开始地址么?
其他的朋友有更好的解决方案么?
作者: chenzengjie    时间: 2007-11-15 11:58
gcc可以写16位代码。
作者: zhongfangqing    时间: 2007-11-15 13:16
谢谢回复,请问gcc如何编16位代码.小弟搜了好久,不得要领.谢谢!
作者: chenzengjie    时间: 2007-11-15 13:27
不知道你是不是在学写操作系统?
我这有本书, 正是讲这个.
用的就是GCC, 当然, 汇编是少不了的. 但也就低层一点.
GCC的后台汇编器as就能生成16位代码.
至于编译C生成16位代码. 我还不知道, 但是肯定能. 至少你能把C编译成汇编程序在里头改不是么?
请不要用TC了, 太老了. C89标准都不符合.

你的汇编好象还没学好.:wink: 定位指令或数据地址没有学到.
作者: zhongfangqing    时间: 2007-11-15 13:38
谢谢楼上朋友的批评指正!
你说的那本是不是<<跟我一起写操作系统>>
我看了,它是跳到保护模式之后再转用C语言的。
我要在实模式下搞。选TC作为编译器,是因为TC明确支持16位的程序,因为tc编出来的程序就是在dos下跑的, 而dos是16位的.
不选gcc的理由:1.现在还不能完全确定gcc可以编16位的
              2,gcc后端的as是用的AT&T语法汇编,要封装读写扇区这样的低层子函数的话,痛苦的忘掉Intel汇编,再看一边AT&T,时间耗的久

关于指定代码段地址:
              小弟知道在汇编中可以用ORG指令来指定代码段的开始地址
              但是现在需要的时C语言编的可执行文件的入口地址被指定
              因为我要把它加载到内存中,如果不能指定入口地址,加载之后,往哪里jmp呢?

谢谢!
作者: chenzengjie    时间: 2007-11-15 13:51
请选GCC
AT&T汇编并不要你花很长时间, 在我看来, 一个小时就够, 只不过记法变了而已. 你只会感到不习惯而已.
GCC可以将C编译成汇编代码.
你说的指定C程序入口地址GCC的连结器可以做到. 也就是ld 的Ttext参数.

你想要TC写的com程序作为引导扇区么? 开头用org 0x7c00定位数据和代码. 因为这正是它被BIOS放的段偏移.
如果它不是用来boot的. 在程序里所有代码和数据都在一个段中, 起始地址为段内偏移0x100
程序本身不用做什么, 要的是加载它进内存的代码为它指定cs.也就是一个段. 注意要在com程序开始处按排好ds es之类. 不然会破坏BIOS数据区.

[ 本帖最后由 chenzengjie 于 2007-11-15 13:53 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2