第四章 编译连接工具的使用.

Slides:



Advertisements
Similar presentations
第1章第1章 PC/AT 系統 1 Chapter 1 Chapter 1 PC/AT 系統 001.
Advertisements

DSP技术及应用 Digital Signal Processor 数字信号处理器.
第四章 汇编语言程序开发工具 第一节 汇编语言程序的编写方法 第二节 汇编语言程序的汇编 第三节 COFF的一般概念 第四节 目标文件的链接.
C语言程序设计 主讲教师 :张群燕 电话:
电路和电流 考点知识梳理 中考典例精析 课堂达标训练 专题训练.
第一章 C语言概述 计算机公共教学部.
单片机应用技术 项目一 循环彩灯装置 第7讲 Keil软件的使用 《单片机应用技术》精品课程组 湖北职业技术学院机电工程系.
卷积 有限冲激响应(FIR)数字滤波器 无限冲激响应(IIR)数字滤波器 快速傅立叶变换(FFT) 第8章 数字信号处理典型算法程序设计
第10章 DOS功能调用与BIOS中断调用.
補充: Input from a text file
2017/3/22 如何用C 来完成SN8系列芯片的程序设计 2017/3/22.
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
新世代計算機概論 第14章 程式語言.
第七章 控制器 7.1 控制器的组成及指令的执行 7.2 控制方式和时序的产生 7.3 微程序控制器 7.4 微程序控制器及其微程序设计举例
Using C++ The Weird Way Something about c++11 & OOP tricks
FC OB1 FB SFC 操作系统 SFB OBs 结构化编程 其它
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
项目2 2个LED发光二极管控制 知识与能力目标 熟悉单片机的I/O口功能与特性。
得技通电子 问题 1 右何者非為假指令 (1) XRL (2) EQU (3) MACRO (4) ORG.
本章小结 C51单片机指令系统概述 C51单片机寻址方式 C51单片机指令系统
微处理器设计1 刘鹏 College of ISEE Zhejiang University
第6章 CCS集成开发环境 6.1 CCS系统安装与设置 6.2 CCS菜单和工具栏 6.3 CCS中的编译器、汇编器和链接器选项设置
第2章 MCS-51单片机指令系统与汇编语言程序设计
结构化编程 FC OB1 FB SFC 操作系统 SFB OBs 其它
第5章 TMS320C54x汇编语言程序设计 内容提要 汇编语言程序设计是应用软件设计的基础,主要任务是利用汇编指令和伪指令编写源程序以完成指定的功能。 本章将结合例子介绍TMS320C54x汇编语言源程序设计的基本方法,涉及的内容包括: 汇编语言源程序的格式 常数、字符串、符号和表达式的规定.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
单片机原理与应用 C/C++在现代数字计算机上的实现.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第三章 C++中的C 面向对象程序设计(C++).
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
‘C54x寻址方式 ‘C54x特殊寻址方式说明 ‘C54x指令集 ‘C54x特殊指令使用说明
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第9章 DSP集成开发环境CCS 内容提要 CCS是TI公司推出的用于开发DSP芯片的集成开发环境,它采用Windows风格界面,集编辑、编译、链接、软件仿真、硬件调试以及实时跟踪等功能于一体,极大地方便了DSP芯片的开发与设计,是目前使用最为广泛的DSP开发软件之一。 本章对CCS开发软件的使用作了详细地介绍。首先,对CCS开发软件作了简要地说明,并介绍了该软件的安装及配置;其次,介绍了CCS的基本操作,包括:CCS的窗口和工具条、文件的编辑、反汇编窗口、存储器窗口、寄存器窗口、观察窗口
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
第二章 Java语言基础.
逆向工程-汇编语言
第五章 C/C++及汇编语言的混合编程 5.1 ARM C/C++编译器 5.2 在C/C++程序中内嵌汇编指令
本 章 重 点 单片机的结构特点 单片机的存储器特点 I/O端口的特点 CPU时序 课时安排:3个课时.
Instructions: Language of the Machine
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
合泰半导体股份有限公司 技术讲座 - Holtek V3 C Compiler介绍 主讲人:王幼端 2017/06/15.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
Holtek C Compiler V3--advanced
第7章 在C/C++中使用汇编 罗文坚 中国科大 计算机学院
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言程序设计 主讲教师:陆幼利.
第 3 章、組合語言 作者:陳鍾誠 旗標出版社.
嵌入式系统实验 ● 交叉开发实验 ● 仿真开发实验.
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
姚金宇 MIT SCHEME 使用说明 姚金宇
计算机组成原理课程设计 实验四 简单模型机实验.
開放電腦計劃 報告人:陳鍾誠 2011 年 8 月 20 日 台灣開源人年會 COSCUP 2011 – 中研院
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
iSIGHT 基本培训 使用 Excel的栅栏问题
实验2 中断模拟实验.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
F1-20P PLC简易编程器的使用.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第4章 汇编语言程序设计 本章结合C54x的软件开发过程,介绍DSP所采用的COFF目标文件格式、结构和规范。
步進階梯應用 步進階梯指令(STL) 、(RET) STL [S1] :步進階梯開始 ( ) 指令長度: 1 Step
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
第四章 UNIX文件系统.
第4章 MCS-51汇编语言程序设计 教学基本要求: (1)、了解MCS-51汇编语言程序设计的特点;
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
Presentation transcript:

第四章 编译连接工具的使用

一. C54X汇编工具的使用 C54X的源程序可以使用汇编或C语言编写。使用汇编语言是可以使用助记符指令集(Mnemonic Instruction Set)或代数指令集(Algebraic Instruction Set),但两种不能混用。

两种指令的汇编语言比较 low_pass_mac: push(st1) ; pshm st1 push(st0) ; pshm st0 push(ar0) ; pshm ar0 push(bk) ; pshm bk ar2 = data(#t_ar2) ; mvdm #t_ar2,ar2 ar3= data(#t_ar3) ; mvdm #t_ar3,ar3 ar0 = #1 ; stm #1,ar0 bk = #N ; stm #N,bk *ar3+% = a ; stl a,*ar3+% repeat(#(N-1)),a=0 ; rptz a,#(N-1) a+= *ar2+0% * *ar3+0% ; mac *ar2+0%,*ar3+0%,a

ASM500命令格式如下: asm500 [ input file [ object file [ listing file] ] ] [ -options] input file: 汇编源文件名,缺省后缀为.asm object file: 编译输出的OBJ文件名,缺省后缀为.obj listing file: 产生的列表文件名,缺省后缀为.lst options: 编译器使用的各种选择。常用选项有: -c:若使用该选项,编译器忽略字母的大小写。例如abc与ABC是一样的。系统缺省为区分大小写。

-i:设置搜索路径。通知编译器在指定的搜索路径中去查找.copy,.include中的文件。用法举例:-ic:\c54x。 -l: (小写的L)在编译时产生列表文件,缺省后缀为.lst -mg: 汇编源程序使用代数指令集 或在源代码中使用 . Algebraic -s:将所有的符号都放入符号表。若不使用该选项,编译器仅将全局变量放入符号表。 -v: 指定版本。特别是需要使用BOOTLOADER时,应加-v548开关。

先看两个汇编源程序: file1.asm .global test loop: call test bc loop,ageq .end file2.asm file3.asm .global test .global test test : test: mar *ar3+ mar(*ar3+) add #1,a a=a+#1 ret return .end .end

汇编工具ASM500的使用举例 asm500 file1.asm <enter> asm500 file2 -l <enter> asm500 file3 -mg -l <enter>

TMS320C54x COFF Assembler Version 1.20 Sun Jul 30 12:11:25 2000 Copyright (c) 1997 Texas Instruments Incorporated file2.asm PAGE 1 1 .global test 2 3 000000 test: 4 000000 6D93 mar *ar3+ 5 000001 F000 add #1,a 000002 0001 6 000003 FC00 ret 7 8 .end No Errors, No Warnings

TMS320C54x COFF Assembler Version 1.20 Sun Jul 30 12:21:26 2000 Copyright (c) 1997 Texas Instruments Incorporated file3.asm PAGE 1 1 .global test 2 3 000000 test: 4 000000 6D93 mar(*ar3+) 5 000001 F000 a=a+#1 000002 0001 6 000003 FC00 return 7 8 .end No Errors, No Warnings

C54X汇编语言书写规范 语法: [label][:] 指令 [操作数] [;注释] #前缀表示立即数或直接地址 后缀B或b表示二进制常数 例如: LD #1000B,A 后缀Q或q表示八进制常数,或以0开始的常数 例如: LD #10Q,A (010,A) 十二进制常数 例如: LD #1000,A

C54X汇编语言书写规范 后缀H或h表示十六进制常数 例如: LD #1000H,A 使用.set定义一个符号的值 例如 addr .set 1000h stm #addr, ar0 标号的使用 例如 b loop loop: ssbx intm 使用 .global 定义全局标号

C54X汇编语言书写规范 使用符号$表示当前PC值 例如 B $ 可以使用结构 例如 item .struct .int value .int deltat _len .endstruct . array .tag item .bss array, i_len

C54X汇编语言书写规范 可以定义宏 例如 mypush .macro pshm ah pshm al pshm bh pshm bl endm

二.C54X连接工具的使用 使用LNK500命令可以将一个或多个OBJ文件连接为一个.OUT文件。在连接时,可以通过段定位控制命令将不同的代码、数据写入不同的内存单元。 注意:LNK500生成的OUT文件不是纯二进制代码文件,而是包含代码、符号表、代码定位信息的复合文件。

LNK500的使用格式: lnk500 [ -options] filename 1 . ... filename n 使用举例:lnk500 file1.obj file2.obj -o file.out LNK500命令常用的选项有: -e global_symbol: 定义程序的进入点。global_symbol必须在源程序中使用.global命令说明。 -c:使用C编译器的ROM初始化模式。

将文件file1.asm和file2.asm连接成OUT文件: -cr: 使用C编译器的RAM初始化模式。 -i dir : 指定库文件的路径。 -l filename: 指定连接时使用的库文件名。 -m filename: 生成MAP文件。 -o filename: 指定生成的OUT文件名。系统缺省为a.out。 将文件file1.asm和file2.asm连接成OUT文件: lnk500 file1 file2 -m file.map -o file.out

通过查看MAP文件可以获得变量、子程序等符号的具体地址。注意:MAP文件只列出全局变量的地址。(用.global说明的符号)

三.汇编连接工具对段的处理 为了灵活使用C54X的内存,可以将不同的代码段放入不同的内存中。在汇编源程序中可以使用下列指令: .bss 该指令表示在.bss段中保留空间。 用法: .bss symbol,size .usect 该指令表示在指定的段中保留空间。用法: symbol .usect “section name”,size

.text 将代码或数据放入.text段中 .data 将数据放入.data段中 .sect 将代码或数据放入指定的段中。 用法: symbol .sect “section name”,size 在连接时使用相应的控制命令以确定具体的内存地址。下面给出其中一种方法:其中,.bss, .text, .data 三个段是标准定义,而.vect, .buffer是自定义的。(t.cmd)

MEMORY { PAGE 0: PROG: origin = 1800h, length = 800h PAGE 4: PROG: origin = 0200h, length = 100h PAGE 1: DATA: origin = 0c00h, length = 100h PAGE 2: DATA: origin = 0d00h, length = 200h PAGE 3: DATA: origin = 0f00h, length = 100h } SECTIONS .text > PROG PAGE 0 .vect > PROG PAGE 4 .bss > DATA PAGE 1 .data > DATA PAGE 2 .buffer > DATA PAGE 3

ssbx intm ; disable all interrupt ! 下面是例子程序t.asm的一部分,其中红色部分为段的定义 .bss temp,1 buf .usect ".buffer",10 .sect ".vect" start: b mainstart nop b $ .text mainstart: ssbx intm ; disable all interrupt !

编译连接程序exer.asm,通过MAP文件检查各个段是否装入指定的内存地址。 LNK500的选项可以放入内存定位文件中。如user.cmd,这时使用连接命令可以简化为: lnk500 user.cmd

四.C编译器 C54X的C编译器有两个部分组成:先剖系C源代码并完成优化,然后将其转化为汇编源代码。另一部分就是前面介绍过的汇编语言工具。所以当使用CL500命令对C语言进行编译时,它实际上调用: ac500 —— C 剖析器 opt500 —— 优化器 cg500 —— 汇编语言生成器 asm500 —— 汇编编译器

若在CL500命令中使用了-z选项,C编译器还可以自动调用LNK500完成连接操作。 下面是一些常用的选项: -g: 允许使用C代码级的调试。 -k: 保留生成的汇编源程序。 -ss: 产生C的注释汇编源程序。 -z: 允许调用连接程序。 -o: 完成优化 CL500还有许多有关C剖析,优化的选项。请参考《TMS320C54x Optimizing C Compiler User Guide 》

/**************************************/ /* function.c */ 我们举一个例子: /**************************************/ /* function.c */ /* (Sample file for walkthrough) */ int main(i) int i; { return(i < 0 ? -i : i ); } cl500 -o function <enter>

cl500 -k -o function <enter> (保留汇编) cl500 -ss -o funtion <enter> lnk500 -c function.obj lnk.cmd -o function.out -l rts.lib 或 cl500 function.c -z lnk.cmd -o function.out -l rts.lib C代码的程序入口地址符号为_c_int00。 LNK500时使用的-c和-cr是对C语言中常量(放在.cinit段中)的处理不同。-c表示在运行时处理,而-cr则在装入时处理。

_main: ;* A assigned to _i FRAME #-1 nop STL A,*SP(0) ; |2| ;------------------------------------------------------------------------------ ; 3 | return(i<0 ? -i:i); SSBX SXM LD *SP(0),A ; |3| BC L3,AGEQ ; |3| ; branch occurs ; |3| BD L4 ; |3| NEG A,A ; |3| L3: L4: FRAME #1 ; |4| RET ; |4| ; return occurs ; |4|

优化后的结果 ; _main: ;* A assigned to _i ; 3 | return(i<0 ? -i:i); ;------------------------------------------------------------------------------ SSBX SXM LD *(AL),A ; |3| ABS A,A ; |3| RET ; |4| ; return occurs ; |4|

C语言编写说明 使用Interrupt关键字说明函数的返回使用RETE,例如 interrupt void int_handle() { int j,flag; …… } 汇编完成后,使用开中断RETE返回。

C语言编写说明 使用volatile关键字。优化器会尽量减少存储器的访问,所以有时必须禁止优化,特别是循环控制变量。参见下面的例子 unsigned int *ctrl; while(*ctrl != 0xff); ……

未优化的结果 L2: ;------------------------------------------------------------------------------ ; 4 | while(*ctrl != 0xff); MVDK *SP(0),*(AR1) ; |4| CMPM *AR1,#255 ; |4| BC L2,NTC ; |4| ; branch occurs ; |4|

优化后的结果 …... MVDK *AR1,*(AR1) L2: ;** -----------------------g2: ;** 4 ----------------------- if ( U$1 != 255 ) goto g2; BANZ L2,*AR1(-255) ; |4| ; branch occurs ; |4| ;** ----------------------- return;

增加了volatile关键字后,再优化 L2: ;** -----------------------g2: ;** 4 ----------------------- if ( *ctrl != 255 ) goto g2; CMPM *AR1,#255 ; |4| BC L2,NTC ; |4| ; branch occurs ; |4| ;** ----------------------- return;

C语言编写说明 使用register关键字说明寄存器变量。 在C代码中插入汇编代码: …… i++; asm(“ assembler text”); /* 如 asm(“ nop”); 例子,标准的连接定位文件lnk.cmd

rts.lib -stack 0x2000 -heap 0x2000 MEMORY { PAGE 0: PROG: origin = 3000h, length = 0D000h PAGE 1: DATA: origin = 0800h, length = 0E800h } SECTIONS { .text > PROG PAGE 0 .cinit > PROG PAGE 0 .switch > PROG PAGE 0 .data > DATA PAGE 1 .bss > DATA PAGE 1 .const > DATA PAGE 1 .sysmem > DATA PAGE 1 .stack > DATA PAGE 1

C语言编写说明 C代码的程序入口地址符号为_c_int00。 LNK500时使用的-c和-cr是对C语言中常量(放在.cinit段中)的处理不同。-c表示在运行时处理,而-cr则在装入时处理。 例子 cl500 -g a.c -z lnk.cmd -c or -cr,使用SIM54X,查看-c 和-cr 区别。

C语言调用汇编的例子 <C program:> extern int asmfunc(); int gvar; main() { int i; i = asmfunc(i); } < Assembly program:> _asmfunc: add *(_gvar),A stl a, *(_gval); ret

C语言与汇编相互调用的考虑 参数的传递 返回值的约定 全局变量的使用 汇编中所有符号前面的加_ C程序的进入点:_c_int00