00000000.htm

来自「水木社区 embeded 版精华区 下载」· HTM 代码 · 共 133 行

HTM
133
字号
<?xml version="1.0" encoding="gb2312"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"/><title>C 语言与启动代码(转)                  turbolinux </title></head><body><center><h1>BBS 水木清华站∶精华区</h1></center><a name="top"></a>发信人:&nbsp;eye2eye&nbsp;(独自绽放),&nbsp;信区:&nbsp;Embedded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />标&nbsp;&nbsp;题:&nbsp;C&nbsp;语言与启动代码(转)&nbsp;<br />发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Mon&nbsp;Apr&nbsp;23&nbsp;10:56:10&nbsp;2001)&nbsp;<br />&nbsp;<br />C&nbsp;语言与启动代码&nbsp;<br />&nbsp;&nbsp;&nbsp;本来,各种C语言编译器都提供启动代码,以X86为例,无论是TC、MSC、&nbsp;<br />BC&nbsp;都有。TC在不同模式下启动代码不一样,为C0X.OBJ.&nbsp;<br />&nbsp;&nbsp;&nbsp;一般编程,用不着去修改启动代码.但有的场合就有必要了.笔者为一套系统&nbsp;<br />开发软件时发现:一套系统当没有操作系统时,要想使得系统正常运行是相当困难&nbsp;<br />的.&nbsp;笔者开发的系统CPU为80C188EB,无操作系统.&nbsp;开发工具为TC2.0.&nbsp;为了能使&nbsp;<br />得系统运行,又不能用太低级的语言如汇编,可谓历尽辛苦(当然可以买现成的开发&nbsp;<br />工具和仿真工具,太贵).&nbsp;<br />&nbsp;&nbsp;&nbsp;笔者重写了TC的启动代码,另外还改写了一个重定位工具(把EXE文件变为可&nbsp;<br />直接写入ROM去的文件).因为很少见到类似文章,下面把主要内容写出来,以飨&nbsp;<br />读者.&nbsp;<br />C语言的启动代码如下:&nbsp;<br />&nbsp;<br />;&nbsp;tcstart.asm&nbsp;<br />;&nbsp;for&nbsp;d000&nbsp;code&nbsp;only,&nbsp;external&nbsp;eprom&nbsp;on&nbsp;memory&nbsp;card&nbsp;<br />;&nbsp;FOR&nbsp;PC&nbsp;ROM&nbsp;<br />extrn&nbsp;&nbsp;_main:far&nbsp;;&nbsp;&nbsp;/*&nbsp;&nbsp;说明外部的C语言的MAIN()&nbsp;函数&nbsp;*/&nbsp;<br />_text&nbsp;segment&nbsp;byte&nbsp;public&nbsp;&quot;CODE&quot;&nbsp;;&nbsp;/*&nbsp;C语言生成的代码段&nbsp;*/&nbsp;<br />_text&nbsp;ends&nbsp;<br />_textend&nbsp;segment&nbsp;para&nbsp;public&nbsp;&quot;CODEEND&quot;;&nbsp;&nbsp;/*&nbsp;代码段的结束段&nbsp;*/&nbsp;<br />_textend&nbsp;ends&nbsp;<br />_data&nbsp;segment&nbsp;para&nbsp;public&nbsp;&quot;DATA&quot;;&nbsp;/*&nbsp;C语言生成的初始化数据段&nbsp;*/&nbsp;<br />_data&nbsp;ends&nbsp;<br />_dataend&nbsp;segment&nbsp;para&nbsp;public&nbsp;&quot;DATAEND&quot;;&nbsp;/*&nbsp;初始化数据段的结束段&nbsp;*/&nbsp;<br />_dataend&nbsp;ends&nbsp;<br />_bss&nbsp;segment&nbsp;para&nbsp;public&nbsp;&quot;BSS&quot;&nbsp;&nbsp;;/*&nbsp;C语言生成的非初始化数据段&nbsp;*/&nbsp;<br />_bss&nbsp;ends&nbsp;<br />_bssend&nbsp;&nbsp;segment&nbsp;byte&nbsp;public&nbsp;&quot;BSSEND&quot;;/*&nbsp;C语言生成的非初始化数据结束段&nbsp;*/&nbsp;<br />_bssend&nbsp;&nbsp;ends&nbsp;<br />_stack&nbsp;segment&nbsp;para&nbsp;stack&nbsp;&nbsp;&quot;STACK&quot;&nbsp;;&nbsp;/*&nbsp;堆栈段&nbsp;*/&nbsp;<br />_stack&nbsp;ends&nbsp;<br />DGROUP&nbsp;group&nbsp;_DATA,&nbsp;_DATAEND,&nbsp;_BSS,&nbsp;_BSSEND&nbsp;<br />CGROUP&nbsp;group&nbsp;_TEXT,&nbsp;_TEXTEND&nbsp;<br />_TEXT&nbsp;segment&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;/*&nbsp;代码段&nbsp;*/&nbsp;<br />assume&nbsp;CS:CGROUP,&nbsp;DS:DGROUP,&nbsp;ES:DGROUP,&nbsp;SS:_STACK&nbsp;<br />public&nbsp;start&nbsp;<br />db&nbsp;55h&nbsp;&nbsp;&nbsp;;/*&nbsp;PC&nbsp;ROM&nbsp;标志&nbsp;*/&nbsp;<br />db&nbsp;0AAh&nbsp;<br />db&nbsp;40h&nbsp;<br />jmp&nbsp;start&nbsp;<br />start:&nbsp;cli&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;disable&nbsp;interrupts&nbsp;<br />mov&nbsp;ax,&nbsp;_STACK&nbsp;;&nbsp;initialise&nbsp;stack&nbsp;<br />mov&nbsp;ss,&nbsp;ax&nbsp;<br />mov&nbsp;ax,&nbsp;offset&nbsp;stackend&nbsp;<br />mov&nbsp;sp,&nbsp;ax&nbsp;<br />mov&nbsp;ax,&nbsp;seg&nbsp;_BSS&nbsp;;&nbsp;/*&nbsp;BSS&nbsp;SEG&nbsp;CLEAR&nbsp;*/&nbsp;<br />mov&nbsp;es,&nbsp;ax&nbsp;<br />mov&nbsp;cx,&nbsp;offset&nbsp;DGROUP:endbss&nbsp;<br />mov&nbsp;di,&nbsp;0&nbsp;<br />mov&nbsp;ax,&nbsp;0&nbsp;<br />rep&nbsp;stosb&nbsp;;&nbsp;write&nbsp;to&nbsp;ES:DI&nbsp;<br />mov&nbsp;ax,&nbsp;seg&nbsp;DGROUP&nbsp;&nbsp;;初始化数据段&nbsp;<br />mov&nbsp;es,&nbsp;ax&nbsp;;&nbsp;point&nbsp;ES&nbsp;to&nbsp;_DATA&nbsp;<br />mov&nbsp;cx,&nbsp;offset&nbsp;DGROUP:enddata&nbsp;<br />mov&nbsp;si,&nbsp;0&nbsp;<br />mov&nbsp;di,&nbsp;0&nbsp;<br />assume&nbsp;ds:CGROUP&nbsp;<br />mov&nbsp;ax,&nbsp;seg&nbsp;_TEXTEND:codeend&nbsp;<br />inc&nbsp;ax&nbsp;<br />mov&nbsp;ds,&nbsp;ax&nbsp;;&nbsp;point&nbsp;DS&nbsp;to&nbsp;_CONST&nbsp;<br />rep&nbsp;movsb&nbsp;;&nbsp;copy&nbsp;_CONST&nbsp;to&nbsp;_DATA&nbsp;<br />push&nbsp;es&nbsp;;&nbsp;point&nbsp;DS&nbsp;to&nbsp;_DATA&nbsp;<br />pop&nbsp;ds&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;下面内容非PC&nbsp;机可以不要&nbsp;<br />mov&nbsp;al,&nbsp;80h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;enable&nbsp;NMI&nbsp;<br />out&nbsp;0a0h,&nbsp;al&nbsp;<br />mov&nbsp;al,&nbsp;0bch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;enable&nbsp;8259&nbsp;PIC&nbsp;&nbsp;1011-1100&nbsp;(irq0,1,6&nbsp;enabled)&nbsp;<br />out&nbsp;21h,&nbsp;al&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;上面内容非PC&nbsp;机可以不要&nbsp;<br />sti&nbsp;;&nbsp;enable&nbsp;interrupts&nbsp;<br />call&nbsp;_main&nbsp;&nbsp;&nbsp;;&nbsp;CALL&nbsp;C&nbsp;MAIN()&nbsp;<br />jmp&nbsp;start&nbsp;&nbsp;&nbsp;;&nbsp;<br />_TEXT&nbsp;ends&nbsp;<br />_TEXTEND&nbsp;segment&nbsp;<br />public&nbsp;codeend&nbsp;<br />db&nbsp;16&nbsp;dup(?)&nbsp;;&nbsp;a&nbsp;paragraph,&nbsp;thus&nbsp;_CONST&nbsp;is&nbsp;one&nbsp;byte&nbsp;more&nbsp;<br />codeend&nbsp;label&nbsp;byte&nbsp;<br />_TEXTEND&nbsp;ends&nbsp;<br />_STACK&nbsp;segment&nbsp;<br />db&nbsp;1024&nbsp;dup&nbsp;(&quot;STACK&quot;);&nbsp;<br />stackend&nbsp;label&nbsp;word&nbsp;<br />_STACK&nbsp;ends&nbsp;<br />_BSSEND&nbsp;segment&nbsp;<br />public&nbsp;endbss&nbsp;<br />endbss&nbsp;label&nbsp;byte&nbsp;<br />_BSSEND&nbsp;ends&nbsp;<br />_DATAEND&nbsp;segment&nbsp;<br />public&nbsp;enddata&nbsp;<br />enddata&nbsp;label&nbsp;byte&nbsp;<br />_DATAEND&nbsp;ends&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;<br />编译连接:&nbsp;<br />tasm&nbsp;/mx&nbsp;tcstart&nbsp;<br />bcc&nbsp;-a-&nbsp;-c&nbsp;-f-&nbsp;-G-&nbsp;-K&nbsp;-B&nbsp;-ml&nbsp;-M&nbsp;-N-&nbsp;-O-&nbsp;-r-&nbsp;-v-&nbsp;-y-&nbsp;-Z-&nbsp;-S&nbsp;-O-&nbsp;&nbsp;1.c&nbsp;<br />tlink&nbsp;/m&nbsp;tcstart&nbsp;&nbsp;1&nbsp;tclib,&nbsp;&nbsp;1,&nbsp;&nbsp;1&nbsp;<br />locate&nbsp;&nbsp;1&nbsp;;LOCATE&nbsp;工具,本人无源代码.&nbsp;<br />本人重写了一个工具,&nbsp;EXEBN1.EXE&nbsp;连同本文一起贡献给读者.&nbsp;<br />EXEBN1中在文件长度&gt;64K时或使用CONSTANT说明时,会出问题,正式版本&nbsp;600元.&nbsp;<br />另外,为自行设计的系统写BIOS,也可代为设计嵌入式控制系统.&nbsp;<br />(16BIT&nbsp;OR&nbsp;32BIT,186&nbsp;OR&nbsp;386&nbsp;)&nbsp;<br />提供80C186系列&nbsp;串行&nbsp;EEPROM&nbsp;C&nbsp;语言接口库,简单调试工具,象征性收费.&nbsp;<br />&nbsp;<br />--&nbsp;<br />&nbsp;&nbsp;自己的生活&nbsp;<br />&nbsp;&nbsp;在生活中,有没有可能停下脚步,&nbsp;<br />&nbsp;&nbsp;为自己的梦想,&nbsp;<br />&nbsp;&nbsp;为自己的快乐,&nbsp;<br />&nbsp;&nbsp;为自己的天才,&nbsp;<br />&nbsp;&nbsp;-----好好地为自己活一场!&nbsp;<br />&nbsp;<br />&nbsp;<br />※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;smth.org·[FROM:&nbsp;166.111.63.75]&nbsp;<br /><a href="00000000.htm">上一篇</a><a href="javascript:history.go(-1)">返回上一页</a><a href="index.htm">回到目录</a><a href="#top">回到页首</a></center><center><h1>BBS 水木清华站∶精华区</h1></center></body></html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?