免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1695 | 回复: 5
打印 上一主题 下一主题

裸机问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-15 11:21 |只看该作者 |倒序浏览
用汇编写了一段时间,感觉要疯掉了。得改用C。
因为gcc不支持编译16位的程序,所以,我打算用tc.
然后用我的引导程序把这个tc编译的可执行程序从软盘上读到内存里,jmp到tc的代码段开始位置.
但是好象tc编的东西是在内存0100h处开始执行的。但是裸机里,这个地址出还是BIOS的中断向量表啊。这可怎么办啊?
tc能指定代码段的开始地址么?
其他的朋友有更好的解决方案么?

论坛徽章:
0
2 [报告]
发表于 2007-11-15 11:58 |只看该作者
gcc可以写16位代码。

论坛徽章:
0
3 [报告]
发表于 2007-11-15 13:16 |只看该作者
谢谢回复,请问gcc如何编16位代码.小弟搜了好久,不得要领.谢谢!

论坛徽章:
0
4 [报告]
发表于 2007-11-15 13:27 |只看该作者
不知道你是不是在学写操作系统?
我这有本书, 正是讲这个.
用的就是GCC, 当然, 汇编是少不了的. 但也就低层一点.
GCC的后台汇编器as就能生成16位代码.
至于编译C生成16位代码. 我还不知道, 但是肯定能. 至少你能把C编译成汇编程序在里头改不是么?
请不要用TC了, 太老了. C89标准都不符合.

你的汇编好象还没学好.:wink: 定位指令或数据地址没有学到.

论坛徽章:
0
5 [报告]
发表于 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呢?

谢谢!

论坛徽章:
0
6 [报告]
发表于 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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP