



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
hcs08 c语言 之 混和编程混和编程 1)内嵌汇编HCS08 C 语言提供一个很有用的功能,内嵌汇编。凡是C语言程序段能出现的地方汇编语言源程序都可以出现,但是汇编语言源程序必需位于一个C语言函数中。语法格式1) asm ; /* 注释 */双引号中的内容为关键字,方括号中的内容为可选项。例如:asm sta COPCTL; /* 喂狗 */2) asm ; 注释 ; 注释要求:大括号内每条汇编指令占一行;标号以“:”结尾占一行;注释以“;”开始;可以用变量名访问全局变量和C 函数中的局部变量。汇编语言结束前要保证堆栈内容与汇编开始前一致。例如:用内嵌汇编方法实现统计字符串中字符的个数。int strlen (char *str)/* str 参数由堆栈传递. 函数返回字符串str的长度假定字符串的长度小于256!*/asm LDHX str ; 装入指针CLRA ; 初始化计数器BRA test ; 跳到testloop:AIX #1 ; 指针加1INCA ; 计数器加1test:TST 0,X ; 字符串是否结束?BNE loop ; 下一字符CLRX ; 返回值在 X:A(参见后文);/* 这里可以继续写 C 语言程序段 */2)混和调用混和调用指的是C语言函数调用汇编语言函数和汇编语言函数调用C语言函数。实现混和调用要解决两个问题1:常量和变量的相互访问;2调用协议1常量和变量的相互访问C 语言函数访问汇编语言常量、变量在汇编语言源程序中采用汇编语法定义变量和常量;在C语言中把这些变量、常量声明为外部常量变量,即可以用变量、常量名来访问。汇编器和编译器敏感段名的大小写。例如:汇编源程序中XDEF ASMData, ASMConst ;声明 ASMData, ASMConst 可以在模块外访问MyData: SECTIONASMData: DS.W 1 ; 定义变量MyConst: SECTIONASMConst: DC.W $44A6 ; 定义常量在 C 语言源程序中#pragma DATA_SEG MyData /* 定义变量段 */extern int ASMData; /* 变量 ASMData 是外部模块声明的 */#pragma DATA_SEG DEFAULT /* 返回默认变量段 */#pragma CONST_SEG MyConst /* 定义常数段 */extern const int ASMConst; /* 常量 ASMConst 是外部模块声明的*/#pragma CONST_SEG DEFAULT /*返回默认常数段 */汇编语言访问C语言变量、常量在C语言中用标准格式定义常量、变量,在汇编语言中声明这些常量变量是外部定义即可。例如:在C语言源文件中:unsigned int CData; /* 定义变量 */unsigned const int CConst; /* 定义常量 */在汇编语言源文件中:XREF CData ; 外部声明的变量XREF CConst; 外部声明的常量使用:LDD CConstSTD CData2)调用协议调用协议,即函数参数传递和返回值的协议。对于HC08和HCS08调用协议是不同的。HC08 参数传递:调用者函数把所需参数从左到右依次入栈,调用结束后由调用者函数从堆栈中清除传递的参数。在函数传递的是值参数的情况下,如果最后一个参数长度为2字节,则用X:A寄存器对传递;如果最后一个参数长度为1字节且倒数第2个参数长度超过1字节,则最后一个参数用寄存器A传递;如果最后一个参数长度为1字节且倒数第2个参数长度也是1字节,则最后一个参数用寄存器X传递,倒数第2个参数用寄存器A传递;HCS08返回值:函数返回值总是在寄存器中,根据返回值的类型不同,而采用不同的寄存器返回值类型寄存器char (signed 或 unsigned)Aint (signed 或 unsigned)H:Xpointers/arrays(指针/数组)H:Xfunction pointers(函数指针)H:X如果返回值的长度超过2字节,则在H:X存放返回值的地址。例如:写一段C语言源程序,然后把它编译为汇编语言,观察调用规则#include /* 为了包含中断允许宏定义*/#includeunsigned char r;unsigned char f1(unsigned char v1,unsigned char v2,unsigned char v3,unsigned char v4) v1+=1; v2+=1; v3+=1; v4+=1; return(v4);void f0(void) r=f1(4,9,6,3); void main(void) EnableInterrupts; /*中断允许 */ f0(); for(;) _RESET_WATCHDOG(); /* 喂狗 */ 在C语言源程序中f0函数调用f1函数,传递参数并有返回值函数f1编译后的汇编语言PSHA ; 有参数用X、A传递,入栈保存防止破坏PSHX TSX ; X=SP+1 INC 5,X ; v1+=1,参数v1在sp+6处 INC 4,X ; v2+=1; 参数v2在sp+5处 INC 1,X ; v3+=1; 参数v3在A中,被本函数入栈 INC ,X ; v4+=1; 参数v4在X中,被本函数入栈 LDA ,X ; return(v4);返回值在A中 AIS #2 ; 调整堆栈指针,指向返回地址 RTS ; 返回f0函数函数f0编译后的汇编语言 LDA #4 PSHA ; 参数v1入栈 LDA #9 PSHA ; 参数v2入栈 LDA #6 ; 参数v3用A传递 LDX #3 ; 参数v4用X传递 BSR f1 ; 调用函数f1 AIS #2 ; 清除传递的参数 STA r ; 保存返回值 RTS ; 返回main函数Main函数编译后的汇编语言CLIBSR f0L3:STA _COPCTLBRA L3只要遵循以上调用规则,就可以实现用C函数和汇编函数的相互调用。调用时使用对方定义的函数名。16.2.5启动代码在启动main函数之前HCS08 C 语言会自动运行一段启动代码,进行硬件初始化和建立C语言的运行环境。起动代码一般由编译器自
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防洪排洪工程合同范本
- 灯箱租赁合同范本长
- 收购咖啡鲜果合同范本
- 加装电梯签约合同范本
- 混凝土块购销合同范本
- 防水施工合同范本2017
- 合作双方出资合同范本
- 护士医院劳务合同范本
- 店面展位出租合同范本
- 终身售后装修合同范本
- 2024高海拔地区模块化增压式建筑技术标准
- 于永正教育文集:于永正:我怎样教语文
- 高中英语新外研版选择性必修四Unit2知识点归纳总结(复习课件)
- XX市选调生跟班学习鉴定表
- 身为职场女性:女性事业进阶与领导力提升
- 普洱市森洁乳胶制品有限公司灭菌乳胶医用手套工厂项目环评报告书
- 著名文学著作列夫托尔斯泰《复活》教育阅读名著鉴赏课件PPT
- 泛微协同办公应用平台解决方案
- (新)部编人教版高中历史中外历史纲要上册《第13课-从明朝建立到清军入关课件》讲解教学课件
- 医药行业专题报告:VCTE技术(福瑞股份子公司)专利概览
- GB/T 42430-2023血液、尿液中乙醇、甲醇、正丙醇、丙酮、异丙醇和正丁醇检验
评论
0/150
提交评论