📄 444.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://202.112.58.200"><font face="黑体"><big><big>Tsinghua</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> 嵌入式系统 (BM: turbolinux jacobw) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="嵌入式系统.htm">回到开始</a>][<a href="441.htm">上一层</a>][<a href="445.htm">下一篇</a>]
<hr><p align="left"><small>发信人: eye2eye (独自绽放), 信区: Embedded <br>
标 题: C 语言与启动代码(转) <br>
发信站: BBS 水木清华站 (Mon Apr 23 10:56:10 2001) <br>
<br>
C 语言与启动代码 <br>
本来,各种C语言编译器都提供启动代码,以X86为例,无论是TC、MSC、 <br>
BC 都有。TC在不同模式下启动代码不一样,为C0X.OBJ. <br>
一般编程,用不着去修改启动代码.但有的场合就有必要了.笔者为一套系统 <br>
开发软件时发现:一套系统当没有操作系统时,要想使得系统正常运行是相当困难 <br>
的. 笔者开发的系统CPU为80C188EB,无操作系统. 开发工具为TC2.0. 为了能使 <br>
得系统运行,又不能用太低级的语言如汇编,可谓历尽辛苦(当然可以买现成的开发 <br>
工具和仿真工具,太贵). <br>
笔者重写了TC的启动代码,另外还改写了一个重定位工具(把EXE文件变为可 <br>
直接写入ROM去的文件).因为很少见到类似文章,下面把主要内容写出来,以飨 <br>
读者. <br>
C语言的启动代码如下: <br>
<br>
; tcstart.asm <br>
; for d000 code only, external eprom on memory card <br>
; FOR PC ROM <br>
extrn _main:far ; /* 说明外部的C语言的MAIN() 函数 */ <br>
_text segment byte public "CODE" ; /* C语言生成的代码段 */ <br>
_text ends <br>
_text ends <br>
_textend segment para public "CODEEND"; /* 代码段的结束段 */ <br>
_textend ends <br>
_data segment para public "DATA"; /* C语言生成的初始化数据段 */ <br>
_data ends <br>
_dataend segment para public "DATAEND"; /* 初始化数据段的结束段 */ <br>
_dataend ends <br>
_bss segment para public "BSS" ;/* C语言生成的非初始化数据段 */ <br>
_bss ends <br>
_bssend segment byte public "BSSEND";/* C语言生成的非初始化数据结束段 */ <br>
_bssend ends <br>
_stack segment para stack "STACK" ; /* 堆栈段 */ <br>
_stack ends <br>
DGROUP group _DATA, _DATAEND, _BSS, _BSSEND <br>
CGROUP group _TEXT, _TEXTEND <br>
_TEXT segment ; /* 代码段 */ <br>
assume CS:CGROUP, DS:DGROUP, ES:DGROUP, SS:_STACK <br>
public start <br>
db 55h ;/* PC ROM 标志 */ <br>
db 0AAh <br>
db 40h <br>
jmp start <br>
start: cli ; disable interrupts <br>
mov ax, _STACK ; initialise stack <br>
mov ss, ax <br>
mov ax, offset stackend <br>
mov sp, ax <br>
mov ax, seg _BSS ; /* BSS SEG CLEAR */ <br>
mov es, ax <br>
mov cx, offset DGROUP:endbss <br>
mov di, 0 <br>
mov ax, 0 <br>
rep stosb ; write to ES:DI <br>
mov ax, seg DGROUP ;初始化数据段 <br>
mov es, ax ; point ES to _DATA <br>
mov cx, offset DGROUP:enddata <br>
mov si, 0 <br>
mov di, 0 <br>
assume ds:CGROUP <br>
mov ax, seg _TEXTEND:codeend <br>
inc ax <br>
mov ds, ax ; point DS to _CONST <br>
rep movsb ; copy _CONST to _DATA <br>
push es ; point DS to _DATA <br>
pop ds <br>
pop ds <br>
;下面内容非PC 机可以不要 <br>
mov al, 80h ; enable NMI <br>
out 0a0h, al <br>
mov al, 0bch ; enable 8259 PIC 1011-1100 (irq0,1,6 enabled) <br>
out 21h, al <br>
;上面内容非PC 机可以不要 <br>
sti ; enable interrupts <br>
call _main ; CALL C MAIN() <br>
jmp start ; <br>
_TEXT ends <br>
_TEXTEND segment <br>
public codeend <br>
db 16 dup(?) ; a paragraph, thus _CONST is one byte more <br>
codeend label byte <br>
_TEXTEND ends <br>
_STACK segment <br>
db 1024 dup ("STACK"); <br>
stackend label word <br>
_STACK ends <br>
_BSSEND segment <br>
public endbss <br>
endbss label byte <br>
_BSSEND ends <br>
_DATAEND segment <br>
public enddata <br>
enddata label byte <br>
_DATAEND ends <br>
end <br>
编译连接: <br>
tasm /mx tcstart <br>
bcc -a- -c -f- -G- -K -B -ml -M -N- -O- -r- -v- -y- -Z- -S -O- 1.c <br>
tlink /m tcstart 1 tclib, 1, 1 <br>
locate 1 ;LOCATE 工具,本人无源代码. <br>
本人重写了一个工具, EXEBN1.EXE 连同本文一起贡献给读者. <br>
EXEBN1中在文件长度>64K时或使用CONSTANT说明时,会出问题,正式版本 600元. <br>
另外,为自行设计的系统写BIOS,也可代为设计嵌入式控制系统. <br>
(16BIT OR 32BIT,186 OR 386 ) <br>
提供80C186系列 串行 EEPROM C 语言接口库,简单调试工具,象征性收费. <br>
<br>
-- <br>
自己的生活 <br>
在生活中,有没有可能停下脚步, <br>
为自己的梦想, <br>
为自己的快乐, <br>
为自己的天才, <br>
-----好好地为自己活一场! <br>
<br>
<br>
※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.63.75] <br>
</small><hr>
<p align="center">[<a href="嵌入式系统.htm">回到开始</a>][<a href="441.htm">上一层</a>][<a href="445.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -