⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 444.htm

📁 pcb设计资料初学者难得的入门资料包含工厂制作过程
💻 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 + -