天津大学微机原理第4章汇编语言程序设计_第1页
天津大学微机原理第4章汇编语言程序设计_第2页
天津大学微机原理第4章汇编语言程序设计_第3页
天津大学微机原理第4章汇编语言程序设计_第4页
天津大学微机原理第4章汇编语言程序设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章汇编语言程序设计

4.1编程的步骤

汇编语言程序设计,要求设计者对计算机的硬件结构(包括微机CPU、存贮器结构、接口电路、外部设备特性等)有详细了解,此外应熟悉CPU的指令系统和编程的基本技巧。一.分析问题:任务是什么?工作过程(顺序)?现有条件(硬件结构)、已知数据、运算精度、处理速度等。二.确定算法:将实际问题转化为程序处理模块。三.画程序流程图: 椭圆(或桶型):程序的开始、结束。 矩形框:要进行的工作。 菱形框:判断,框内为判断内容。 圆圈:程序连接点。 指向线:程序流向。 子程框:框内为子程名。

画流程图时,按程序处理的顺序,由上至下逐步绘制。对于复杂的系统,可先画总体流程图(主程序框图),再画各模块的局部框图。四.编制程序

为便于理解程序,可以在程序中添加注释。在一行语句中,分号“;”后面的内容为注释。注释部分经汇编后不会生成任何机器指令码。若“*”在一行语句的第一列,则表示该行为注释。注意:汇编指令中的冒号(:)、逗号(,)、分号(;)、星号(*)等标点符号要在英文状态下输入才合法,如果在中文状态下输入,编译器会认作非法字符,在编写汇编代码时应该注意把输入法的状态切换到英文输入状态。5.4HCS08CPU与HC08CPU的比较4.208汇编语言基础4.2.108汇编源程序格式

把汇编语言写成的源程序“翻译”成机器语言的工具叫汇编程序或编译器(Assembler),以下统一称作编译器。汇编语言源程序可以用通用的文本编辑软件书写编辑,以ASCII码形式存盘。具体的编译器对汇编语言源程序的格式有一定的要求,同时,编译器除了识别单片机的指令系统外,为了能够正确地产生目标代码以及方便汇编语言的编写,编译器还提供了一些在汇编时使用的命令、操作符号,在编写汇编程序时,也必须正确使用它们。由于编译器提供的指令仅是为了更好地做好“翻译”工作,并不产生具体的机器指令,因此这些指令被称为伪指令(PseudoInstruction)。汇编语言源程序以行为单位进行设计,每一行最多可以包含以下四个部分:《嵌入式应用技术基础教程》课件标号操作码操作数注释5.4HCS08CPU与HC08CPU的比较(1)标号(Labels)对于标号有下列要求及说明:如果一个语句有标号,则标号必须从第一列开始书写。可以组成标号的字符有:字母A~Z、数字0~9、下划线“_”、美元符号“$”,但开头的第一个符号不能为数字和$。08编译器不区分标号中字母的大小写。标号应小于16个字符。标号后可以带冒号“:”,也可以不带冒号。一个标号在一个程序中只能定义一次。若一行中第一个字符是星号“*”,这是标号,表明该行为注释。一行语句若只有标号,编译器将把当前程序计数器的值赋给该标号。若希望更多的编译器能够识别,建议标号长度小于8个字符。“#”表示立即数。

操作码不能从第一列开始,否则会被当成标号.《嵌入式应用技术基础教程》课件(2)操作码(Opcodes)

操作码包括指令码以及后面即将介绍的08编译器可以识别的伪指令码。对于有标号的行,必须用至少一个空格或制表符(TAB)将标号与操作码隔开。对于没有标号的行,不能从第一列开始写指令码,应以空格或制表符(TAB)开头。08编译器不区分操作码中字母的大小写。

(3)操作数(Operands)

操作数可以是地址、标号或指令码定义的常数,也可以是由伪运算符构成的表达式。08编译器识别下列伪运算符:加(+)、减(-)、乘(*)、除(/)、特殊除(\,允许被除数为0,此时认为结果也为0)、左移(<)、右移(>)、取余数(%)、与(&)、或(|)、异或(^)。如果超过一种运算或中间有插入空格应使用{}把它们包含在内。(4)注释(Comments)注释即是说明文字,若是处于指令之后,则用空格和分号“;”与指令分开,若整行为注释文字,则在第一列写上“;”或“*”。《嵌入式应用技术基础教程》课件HCS08伪指令4.2.2伪指令(Pseudo):

在汇编程序中定义的各种汇编命令。用以指定程序的实际存放地址、定义各种文字符号的数值等。这些命令并不产生机器码,仅起到汇编时的辅助作用。以下为HCS08汇编程序中定义的一些常用伪指令。

㈠.汇编起始命令:格式:ORG16位地址功能:定义此指令后面源程序的汇编地址(目标程序存放的首地址)例:ORG2000HSTART:LDA#64H……

则规定LDA#64H从2000H单元开始存放,同时将标号START定义为2000H。

*ORG指令可多次使用。㈡.汇编结束命令:

格式:END

功能:通知汇编程序结束汇编。

*END指令仅用于整个源程序的结束。

4.3汇编语言程序的基本结构

一.顺序程序:无分支、循环,程序按顺序逐条执行用CODEWARRIOR编1+1;二.分支程序:按不同的条件执行不同的程序分枝。程序实例:(注意条件转移语句在分支产生中的作用。)

例1:若$70单元中的8位2进制有符号数为正(或0),则将其除以3,为负则求其绝对值,结果存人$71单元。ORG$E000

LDA $70 BLT ABS ;为负转绝对值处理BMI行吗?BLO呢? LDX #3 ;正数,除以3 CLRH DIV BRA DONEABS: NEGA ;数值取反(按位取反后+1),不同于COM(按位取反)DONE:STA $71 BRA $END例2:按下式计算函数的值,结果存入FUN单元

FUN=X1-3 (若X1≧10)

=X1×8+9(若X1﹤10);X1为8位2进制无符号数。

X1: EQU $70 FUN: EQU $80 ORG$E000 LDA X1

CMP #10

BLO LESS ;BCS LESSifc=1;BMIifN=1

SUB #3 BRA DONE LESS:LDX #8 MUL ADD#9 DONE:STA FUN BRA $END

习题一

1.若($70)=$24,将其传送到$80单元,否则传送到$81单元。讲评:1.$24是立即数2.注意第一步结束要用BRA指令跳转.3.不能Y:EQU#$24.4.第1列只能用来写标号2.若X1(8位无符号数)为奇数,将其加1;为偶数将其除以2,结果送Y。

讲评:1.怎么判断奇偶。2.别忘用伪指令定义X1和Y。3.怎么实现处以23.按下式计算函数的值,结果存入RESULT单元

RESULT=(X1+5)×10(若X1≦20)

=X1÷6+18(若X1>20);X1为8位2进制无符号数。

讲评:1.怎么判断≦。2.别忘用伪指令定义X1和RESULT。3.怎么实现处以6三.循环程序:

自动重复执行某段程序。一般包括以下几部分

㈠.置循环初值:设循环计数器初值、设数据地址指针、某些寄存器清零或设定常数等。㈡.循环体(循环工作部分):重复执行的程序段。㈢.循环控制:保证循环正确进行。⑴.修改控制变量:如数据指针,循环计数器等⑵.循环结果控制:判断是否结果循环。

㈣.典型循环结构:

例1.无符号数求最大值内部RAM,首址$60的30字节数据块,求最大值,存于$80单元中。

MAX: EQU $80BLOCK: EQU $60 NUMB: EQU 30COUNT: EQU $81

ORG$E000 LDHX#$260 ;initializethestackpointer TXS CLI ;enableinterruptsSTART:LDX #BLOCK ;设数据指针 CLRH MOV #NUMB﹣1,COUNT ;比较次数→COUNT,比较NUMB-1次

LDA ,X ;取第一个数LOOP: INCX ;修改指针 CMP ,X ;A的数与指针处的数比较大小

BCC L1 ;A的数大,去L1ifc==0 LDA ,X ;A的数小就将指针处的数给AL1: DBNZ COUNT,LOOP ;比较的次数是否够,先判断再减1 STA MAX BRA $ END例2:统计以$60为首址的50字节有符号数中负数个数,存入$A0单元。

DATA1: EQU $60MINUS: EQU $A0NUMB: EQU 50 ORG$E000 CLRH LDX #DATA1 LDA #NUMB PSHA ;采用DBNZ

1,SP,REL

MOV #0,MINUS;LOOP: LDA ,X

BPL NEXT;ifN==0;BMIifN==1 INC

MINUSNEXT: INCX

DBNZ 1,SP,LOOP AIS #1;?????? BRA $ END例3.试编写程序,查找在内RAM的$60—$80单元中是否有$AA这一数据,若有,则将$81单元置为1,否则将其置为00。程序: ORG $E000 CLRH LDX #$60 MOV #0,$81 LDA #$AA ;要比较的字符LOOP: CBEQ ,X+,DONE ;相等跳转

CPX #$81 ;查询指针是否到 BNE LOOP BRA OVERDONE: MOV #1,$81OVER: NOP BRA $END* 注意此循环有两种结束方式。

例4.软件定时子程序

TIME1: EQU 100 TIME2: EQU 50 C1: EQU $60 C2: EQU $61TIME: MOV #TIME1,C1LOOP2: MOV #TIME2,C2LOOP1: NOP NOP DBNZ C2,LOOP1 DBNZ C1,LOOP2 RTS四.子程序结构

㈠.基本结构:主程序用“调用”指令进入子程,子程结束用“返回”指令回到主程断点继续执行。*子程嵌套:在子程中调用其它子程。㈡.现场信息保护:在主程和子程“争用”某些寄存器时,应将其内容“保护”起来。(压入堆栈)*在利用堆栈保护现场时,须注意保持堆栈平衡。㈢.工作参数的传递入口参数:调用子程时,主程为子程设置的参数。主程将入口参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论