汇编程序设计初步.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
汇编程序设计初步

单片机原理与应用 汇编程序设计初步 程序在内存中的映象 程序在内存中的映象 MASM32汇编初始化指令 51单片机汇编初始化指令 51本身无特殊初始化指令需要 依据不同芯片、不同编译器,可能需要不同的初始化指令、头文件、库文件 编译器/汇编器本身模式设置等 芯片厂商特殊设备支持 IDE的特殊设置需求 程序分段 程序分段 程序分段 常见汇编程序段 代码段/CODE/TEXT 程序的执行代码/函数 数据段/DATA 全局变量、常量 BSS段:Block Started by Symbol 未初始化的全局变量 堆栈段/STACK 线程的堆栈 程序的起始地址设置 MASM起始地址设置语法 MASM32汇编基本框架 51单片机起始地址设置语法 51单片机起始地址固定为0 被汇编、连接到地址0的执行代码即为起始代码。第一个模块的第一条指令必须是程序的起始位置。 51单片机汇编基本框架 汇编函数 汇编函数 汇编语言语法层面无函数概念 无函数定义语法/语义 部分汇编器有函数的语法,但仅仅是提示性语义,非约束性语义,语法本质上仍然没有函数的概念 无函数调用语法/语义 部分汇编器的语法可以用宏实现类似函数调用语法,但仅仅是宏,语法本质上并无函数调用概念 汇编函数 汇编函数(语法)入口 任意标签在语法上均可作为汇编函数如可 理论上在数据段的标签也可以作为汇编函数入口,但部分汇编/连接器不接受跨段类别的符号解析,会拒绝类似用法 汇编函数出口(结束点) 汇编语法没有出口的概念 ?语法上汇编函数可并行、嵌套、交叉…… 汇编函数 良好的汇编函数编程风格 单入口、单出口、不嵌套、不交叉 尽可能与高级语言函数语法限制靠拢 函数头尾添加注释分割 视觉上易于阅读、维护 函数头适当对齐到需要的地址边界 可适当提升性能 汇编函数 汇编函数 函数调用:参数传递 汇编语言语法上不存在函数参数的相关内容 理论上,汇编函数的参数传递方式可以任意约定 实际工程中,通常遵循某种标准约定 C/STDCALL/PASCAL:通过栈传递参数 FASTCALL:通过寄存器传递参数 不同编译器、操作系统采用不同约定 Windows: STDCALL Linux/RISC: FASTCALL 汇编函数 函数调用:参数传递 汇编函数 函数调用:参数传递 X86的FASTCALL EAX/EDX/ECX对应第1~3个参数,后续参数压栈 第一个64位参数使用寄存器对EAX:EDX 浮点参数额外约定 汇编函数 函数调用:参数传递 51单片机SDCC参数传递约定 第一个参数使用寄存器 8位:DPL;16位:DPTR;24位:B:DPTR;32位:A:B:DPTR 第二个及以后参数使用栈或内存 加编译选项—stack-auto或函数带reentrant属性,则使用栈传递 缺省使用预先分配的全局变量 命名规则:_function_name_PARM_n 不可重入! 汇编函数 51单片机SDCC函数第一个参数传递 汇编函数 51单片机SDCC函数多个参数传递 汇编函数 函数调用:参数清除 C/PASCAL:调用者清除 51单片机SDCC使用C约定 STDCALL:被调用者清除 FASTCALL:一般不用清除 汇编函数 函数调用:返回值 51单片机SDCC 8位:DPL;16位:DPTR;24位:B:DPTR;32位:A:B:DPTR X86 不超过32位:EAX 64位:EAX:EDX 更多:不同编译器有不同约定 浮点:浮点寄存器ST(0) 汇编函数 函数实现:局部变量 分配:在栈中,通过移动栈指针分配 访问:通过“栈指针+偏移” 汇编函数 函数实现:访问函数参数 通过“栈指针+偏移” 汇编函数 分支结构 汇编函数 x86比较运算 X86具有几乎所有可能的比较转移指令 注意区分有符号比较与无符号比较,二者适用不同指令 汇编函数 51比较运算 相等/不等条件转移 jz/jnz:累加器为0/非0转移 cjne:比较两数,不等转移 进位/无进位转移 jc/jnc:等效于无符号“大于/小于等于” 课本缺此指令介绍! 其它比较运算需要变换 汇编函数 51比较运算 无符号: AB ? BA 无符号=:A=B ? B=A 有符号==和!=等同无符号对应运算 有符号其它比较可转换成有符号数再比较 8位:有符号数平移128即为无符号数 汇编函数 x86多分支结构 可以转换成多个if-else结构,也可查表优化 汇编函数 51多分支结构 一般使用查表 汇编函数 循环结构 汇编循环通常从大往小,代码最简洁 X86通常用ecx作为循环变量 51可单指令实现循环变量减一和条件转移 switch(status) { case 1: …… case 2: …… …… } mov

文档评论(0)

sunshaoying + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档