设为首页收藏本站

腾控科技论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4806|回复: 0

X86启动代码与定位工具

[复制链接]
steelen 发表于 2010-7-23 11:51:29 | 显示全部楼层 |阅读模式
本人在用80C188EB开发过一个通讯控制器,配有8个串口,其中有两个为同步/异步,6个异步。配有512K ROM,512K RAM,RTM,8K串行EEPROM。用TC作开发工具,除了应用程序外,主要的难点在于:C语言的启动代码;定位工具;串行EEPROM的接口库。这里仅介绍C语言的启动代码。
    本来,各种C语言编译器都提供启动代码,以X86为例,无论是TC、MSC、BC都有。TC在不同模式下启动代码不一样,为C0X.OBJ.一般编程,用不着去修改启动代码。但有的场合就有必要了。笔者为一套系统开发软件时发现:一套系统当没有操作系统时,要想使得系统正常运行是相当困难的。笔者开发的系统CPU为80C188EB,无操作系统,开发工具为TC2.0。为了能使得系统运行,又不能用太低级的语言如汇编,可谓历尽辛苦(当然可以买现成的开发工具和仿真工具,太贵)。
    笔者重写了TC的启动代码,另外还改写了一个重定位工具(把EXE文件变为可直接写入ROM去的文件)。因为很少见到类似文章。下面把主要内容写出来,以飨读者。以后我准备把这个工具完善以下,做成一个重新定位的工具。

   C语言的启动代码如下:
; tcstart.asm
; for d000 code only, external eprom on memory card
; FOR PC ROM
extrn  _main:far;

/*  说明外部的C语言的MAIN() 函数,这也是 C 语言为什么非要从MAIN()开始的原因 */
_text segment byte public 'CODE' ; /* C语言生成的代码段 */
_text ends
_textend segment para public 'CODEEND';  /* 代码段的结束段 */
_textend ends
_data segment para public 'DATA'; /* C语言生成的初始化数据段 */
_data ends
_dataend segment para public 'DATAEND'; /* 初始化数据段的结束段 */
_dataend ends
_bss  segment para public 'BSS'  ;/* C语言生成的非初始化数据段 */
_bss  ends
_bssend  segment byte public 'BSSEND';/* C语言生成的非初始化数据结束段 */
_bssend  ends
_stack segment para stack  'STACK' ; /* 堆栈段 */
_stack ends
DGROUP group _DATA, _DATAEND, _BSS, _BSSEND /* 把数据的段构成一个组,代码连在一起 */
CGROUP group _TEXT, _TEXTEND /* 把代码的段构成一个组,代码连在一起 */
_TEXT segment    ; /* 代码段 */
assume CS:CGROUP, DSGROUP, ESGROUP, SS:_STACK

start: cli            ; disable interrupts
mov ax, _STACK ; initialise stack
mov ss, ax
mov ax, offset stackend
mov sp, ax
mov ax, seg _BSS ; /* BSS SEG CLEAR */
mov es, ax
mov cx, offset DGROUP:endbss
mov di, 0   
mov ax, 0
rep stosb ; write to ESI
mov ax, seg DGROUP  ;初始化数据段
mov es, ax ; point ES to _DATA
mov cx, offset DGROUP:enddata
mov si, 0
mov di, 0
assume ds:CGROUP
mov ax, seg _TEXTEND:codeend
inc ax
mov ds, ax ; point DS to _CONST
rep movsb ; copy _CONST to _DATA
push es ; point DS to _DATA
pop ds
                             ;下面内容非PC 机可以不要
mov al, 80h      ; enable NMI
out 0a0h, al
mov al, 0bch     ; enable 8259 PIC  1011-1100 (irq0,1,6 enabled)
out 21h, al
                             ;上面内容非PC 机可以不要
sti  ; enable interrupts
call _main   ; CALL C MAIN()
jmp start   ;
_TEXT ends
_TEXTEND segment
public codeend
db 16 dup(?) ; a paragraph, thus _CONST is one byte more
codeend label byte
_TEXTEND ends
_STACK segment
db 1024 dup ('STACK');/* 预留的堆栈空间 */
stackend label word
_STACK ends
_BSSEND segment
public endbss
endbss label byte
_BSSEND ends
_DATAEND segment
public enddata
enddata label byte
_DATAEND ends
        end
编译连接:
tasm /mx tcstart
bcc -a- -c -f- -G- -K -B -ml -M -N- -O- -r- -v- -y- -Z- -S -O- %1.c
tlink /m tcstart %1 tclib, %1, %1
locate %1; LOCATE 工具,本人无源代码。
  本人重写了一个工具, EXEBN1.EXE 连同本文一起贡献给读者。
  EXEBN1中在文件长度>64K时或使用CONSTANT说明时,会出问题,正式版本600元。
  另外,为自行设计的系统写BIOS,也可代为设计嵌入式控制系统。(16BIT OR 32BIT,186 OR 386 )
提供80C186系列串行EEPROM C 语言接口库,简单调试工具,象征性收费。
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
您需要登录后才可以回帖 登录 | 注册

本版积分规则

产品样机试用申请

QQ|小黑屋|手机版|Archiver|腾控科技|腾控科技 ( 京ICP备09109731号  

GMT+8, 2020-10-25 07:36 , Processed in 0.115428 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表