?? 00000000.htm
字號:
<?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 水木清華站∶精華區(qū)</h1></center><a name="top"></a>發(fā)信人: eye2eye (獨自綻放), 信區(qū): Embedded <br />標 題: C 語言與啟動代碼(轉) <br />發(fā)信站: BBS 水木清華站 (Mon Apr 23 10:56:10 2001) <br /> <br />C 語言與啟動代碼 <br /> 本來,各種C語言編譯器都提供啟動代碼,以X86為例,無論是TC、MSC、 <br />BC 都有。TC在不同模式下啟動代碼不一樣,為C0X.OBJ. <br /> 一般編程,用不著去修改啟動代碼.但有的場合就有必要了.筆者為一套系統 <br />開發(fā)軟件時發(fā)現:一套系統當沒有操作系統時,要想使得系統正常運行是相當困難 <br />的. 筆者開發(fā)的系統CPU為80C188EB,無操作系統. 開發(fā)工具為TC2.0. 為了能使 <br />得系統運行,又不能用太低級的語言如匯編,可謂歷盡辛苦(當然可以買現成的開發(fā) <br />工具和仿真工具,太貴). <br /> 筆者重寫了TC的啟動代碼,另外還改寫了一個重定位工具(把EXE文件變?yōu)榭?amp;nbsp;<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 />另外,為自行設計的系統寫B(tài)IOS,也可代為設計嵌入式控制系統. <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 水木清華站∶精華區(qū)</h1></center></body></html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -