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>发信人: 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 />_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 /> ;下面内容非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 /><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 + -
显示快捷键?