单片机原理及其嵌入式应用教程_第1页
单片机原理及其嵌入式应用教程_第2页
单片机原理及其嵌入式应用教程_第3页
单片机原理及其嵌入式应用教程_第4页
单片机原理及其嵌入式应用教程_第5页
已阅读5页,还剩384页未读 继续免费阅读

下载本文档

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

文档简介

,单片机原理及其嵌入式应用教程,January 6, 2018,单片机概述,单片机的发展,处理器体系结构_冯.诺依曼结构,存储器有程序存储器与数据存储器,一般前者用ROM,后者用RAM,他们与CPU的连接有两种方案:冯.诺依曼结构和哈佛结构。冯诺伊曼结构,也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。冯诺伊曼结构计算机将代码作为一种特殊的数据来操作。这种结构方案如下图:,Motorola公司的微处理器采用此种结构,存储器统一编址,哈佛结构,哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令总线和数据总线有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。 Intel公司的MCS-51/96系列的单片机就是采用这种结构这种结构方案如下图:,存储器分离编址,I/O端口和寄存器的编址,I/O端口分离编址:I/O端口独立开辟一个空间,用专门的I/O访问扩展线与指令实现I/O操作。如Intel公司的8086指令系统有IN和OUT指令实现I/O口操作。I/O端口统一编址:将I/O地址与存储器地址统一在一个空间,分配不同的地址。寄存器编址原则类似。Motorola微控制器的寄存器占用存储器资源,为它们分配了一些专用的地址空间,CPU,程序存储器数据存储器I/O端口寄存器,统一编址的体系结构,内部时序,内部时序CPU08内部时序由4相(节拍)组成,分别为T1、T2、T3、T4,各相输出一个时钟脉冲,相位差90。每4拍组成一个CPU时钟周期,可合并看成一个CPU总线时钟。定义T1上升沿为CPU总线时钟上升沿,地址总线上下一个新地址在T3上升沿开始有效。数据总线上的数据刷新与T1上升沿同步如总线时钟频率为8M,CPU的T节拍频率就为32M,锁相环时钟发生电路或晶振电路需输出32M的时钟频率。,内部时序,内部时序CPU08内部时序由4相(节拍)组成,分别为T1、T2、T3、T4,各相输出一个时钟脉冲,相位差90。每4拍组成一个CPU时钟周期,可合并看成一个CPU总线时钟。定义T1上升沿为CPU总线时钟上升沿,地址总线上下一个新地址在T3上升沿开始有效。数据总线上的数据刷新与T1上升沿同步如总线时钟频率为8M,CPU的T节拍频率就为32M,锁相环时钟发生电路或晶振电路需输出32M的时钟频率。,流水线技术,流水线技术将每条指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,以加速程序运行过程。例如将指令分为3步:,采用流水线技术后,并没有加速单条指令的执行,但实现多条指令的不同步骤同时执行,总体上加快了指令流速度缩短程序执行时间,M68HC908GP32单片机基本结构概述,January 6, 2018,基本结构概述,MC68HC908GP32,TBM,SCI,SPI,TIM1,TIM2,32kHz 时钟发生器模块,时基模块,33 个双向 I/O口所有I/O引脚允许 10mA 灌电流 10mA 拉电流,两个 2通道 16-Bit 定时器 输入捕捉 输出比较 脉宽调制输出PWM,异步串行通信接口SCI,同步串行外围接口SPI,DIP 40, QFP 44,32256字节Flash存储区,控制及状态寄存器区,32192字节未定义,3字节未定义区,16字节未定义区,307字节监视ROM区,43字节未定义区,Flash块保护寄存器,93字节未定义区,36字节Flashu复位和中断向量区,$FFFF,$FF0F,$FF0D,$FE0C,$FE00,$FDFF,$8000,$7FFF,$0240,$023F,$0040,$003F,$0000,$FF10,$FE1F,$FE20,$FF52,$FF53,$FF7D,$FF7E,$FF7F,$FFDB,$FFDC,512字节RAM,64字节I/O寄存器区,HC08GP32存储器组织,M68HC08中央处理器结构,7 0,15 8 7 0,15 0,7 0,15 0,算术逻辑运算部件ALU,A,H,X,SP,CCR,PC,CPU寄存器,M68HC08系列单片机的CPU寄存器,16-bit 16-bit 16-bit Easier Signed Arithmetic ,累加器(A) Accumulator (A),堆栈指针(SP) Stack Pointer (SP),程序计数器(PC) Program Counter (PC),条件寄存器(CCR) Condition Code Register (CCR),进位/借位标志 Carry/Borrow (MSB),负标志位 Negative (MSB = 1),中断屏蔽标志位 Interrupt Mask,半进位标志位 Half-Carry (for BCD),零标志位 Zero,溢出标志位 Twos Compliment Overflow,January 6, 2018,寻址方式与指令系统,隐含寻址,隐含寻址 INH Inherent,CPU08 有16种寻址方式,执行指令的所有信息均在操作码中,CPU不需要从寄存器、存储器中取操作数,操作数隐含在累加器、变址寄存器或状态寄存器中。具有隐含寻址方式的指令均为单字节指令,INCA;累加器A内容加1,机器码$4CINCX; 变址寄存器X内容加1,机器码$5CDECA;累加器A内容减1,机器码$4ADECX; 变址寄存器X内容减1,机器码$5ACEI; 中断屏蔽位I清0,机器码$9ASEI; 中断屏蔽位I置1,机器码$9B,立即寻址,操作数包含在操作码的后继字节中。立即寻址主要用于访问常数,多为二字节指令,第一个字节为操作码,第二字节为操作数,在立即寻址方式中操作数为立即数,立即数前要加符号前缀“#”,说明是操作数值而不是地址。,立即寻址 IMM Immediate,LDA #%01011010;将二进制数01011010送累加器A,机器码为$A65A,%表示后面的操作数是二进制数。ADD #$30;将累加器A的内容与立即数$30进行不带进位加运算,结果存至A,机器码$AB30,$表示后面的操作数为16进制数LDHX #$8030;三字节指令,给变址寄存器H:X赋值$8030,机器码为$458030,执行后H的(H)=$80,(X)=$30LDX #-10 ;默认十进制,直接寻址,直接寻址 DIR Direct,操作数的有效地址包含于操作码后的一个字节中。由于操作数的有效地址仅1字节,由此直接寻址方式只能对存储器0页的256个字节空间($0000$00FF)进行操作。0页存储器有I/O控制和状态寄存器,常用的用户数据也尽量放在0页,这样访问可节省程序空间,提高访问速度。直接寻址指令一般为双字节指令第一字节是操作码,第二字节是操作数有效地址。,STA $40;将累加器A中的值送$40单元,STA $40,$7F,LDA $40;将$40单元内容送累加器A中,LDA $40,$7F,$7F,$7F,LDA #$77STA $40LDA $40,扩展寻址,扩展寻址 EXT Extended,操作数的有效地址包含于操作码后的两个字节中。由于操作数有效地址2字节,可寻址64k存储空间。扩展寻址一般为三字节第二、三字节是操作数有效地址,LDA $0200;将$0200单元内容送累加器A,机器码为$C60200STA $0240;将累加器A的内容送$0200单元,机器码为$C7024,变址寻址_无偏移量变址寻址,无偏移量变址寻址,操作数的有效地址在16位变址寄存器H:X中。由于H:X为16位,可访问64k空间。无偏移量变址寻址指令为单字节指令,LDA , X;将H:X指定的存储单元的内容送A,机器码为$F6,$7F,LDA ,X,H:X起到16位指针的作用,变址寻址_8位偏移量变址寻址,8位偏移量变址寻址,操作数的有效地址是16位变址寄存器H:X中的无符号整数与操作码后的一个字节无符号整数之和,也可以访问64k空间。8位偏移量变址寻址指令为双字节指令,LDA $10, X;将H:X中的值加上偏移量$10所得地址的存储单元的内容送A,机器码为$E610,$7F,LDA $10,X,变址寻址_16位偏移量变址寻址,16位偏移量变址寻址,操作数的有效地址是16位变址寄存器H:X中的无符号整数与操作码后的两个字节无符号整数之和,也可以访问64k空间。16位偏移量变址寻址指令为三字节指令,LDA $100, X;将H:X中的值加上偏移量$100所得地址的存储单元的内容送A,机器码为$D60100,$7F,LDA $100,X,8位偏移量和16位偏移量,8位偏移量为无符号整数设LDHX #$0090STA $C0,X 将累加器内容送$0150单元16位偏移量为符号数STA $FFFE,X 将累加器A的内容送$8E单元STA -$10,X 将累加器A的内容送$80单元,查表程序,LOOK: LDA Tab,X ;LDA 32773,X BRA *Tab FCB $00,$01,$04,$09 FCB $10,$19,$24,$31 FCB $40,$51,8005,Tab,查找表首地址800E7,变址:H:X不变,改变偏移量偏移量不变,改变H:X,变址寻址,变址寻址以H:X作为指针,无偏移量变址寻址(IX) STA , X,8位偏移量变址寻址 (IX1) ADD $10, X,16位偏移量变址寻址(IX2) AND $1030, X,如(H:X)=$1030,操作数地址为,$1030,$1040,$2060,堆栈,堆栈由栈区和堆栈指针构成。栈区是一组按先进后出(FILO)方式工作的寄存器或存储单元,用于存放数据。堆栈指针(SP)是用来指示栈顶地址的寄存器,用于自动管理栈区,指示数据存入(进栈)或取出(出栈)的位置。,A,$0100,$00FF,B,$00FE,$00FE,B,A,$00FF,$0100,堆栈类型,硬件堆栈:栈区由微处理器内部的寄存器组构成;软件堆栈:由软件在内存中开辟一个特定的RAM区构成栈区。,堆栈指针用来指示栈顶位置,可由用户设初值,一旦设定后栈底位置即确定,此后SP内容即栈顶位置由CPU自动管理。随着堆栈操作的进行,SP的值会自动变化,其变化方向因栈区的编址方式分为向下增长型和向上增长型。,向下增长型堆栈: 数据进栈时,SP自动减量,向上浮动而指向新栈顶。数据出 栈时,SP自动增量,向下浮动指向新栈顶,M68HC08就是向下增长型。向上增长型堆栈与之相反,堆栈主要用于中断处理和子程序调用,堆栈寻址,堆栈寻址,堆栈指针是16位寄存器,堆栈寻址就是将堆栈指针作变址寄存器使用。,堆栈寻址有8位偏移量(SP1)和16位偏移量(SP2)两种例如:SP1:LDA $10, SP;将SP中的值加上$10所得和作为存储器单元地址,将其内容送 A,机器码$9EE610如(SP)=$0200,指令将($0210)送ASP2:ADC $0120,SP; ;将SP中的值加上$0120所得和作为存储器单元地址,将其内容与A的值进行带进位加法,结果送 A,机器码$9ED90120如(SP)=$0200,(A)=$35,进位位C=1,($0120+$0200)=$35,指令执行后(A)=$6B,堆栈寻址_8位偏移量堆栈变址寻址,8位偏移量堆栈变址寻址(SP1),操作数的有效地址是16位堆栈指针(SP)中的无符号整数与操作码后的一个字节无符号整数之和,也可以访问64k空间。8位偏移量堆栈变址寻址指令为三字节指令,LDA $10, SP;将SP中的值加上偏移量$10所得地址的存储单元的内容送A,机器码为$9EE610,$7F,LDA $10,SP,A,0200,堆栈寻址_16位偏移量堆栈变址寻址,16位偏移量堆栈变址寻址(SP2),操作数的有效地址是16位堆栈指针(SP)中的无符号整数与操作码后的一个字节无符号整数之和,也可以访问64k空间。16位偏移量变址寻址指令为三字节指令,LDA $100, SP;将SP中的值加上偏移量$100所得地址的存储单元的内容送A,机器码为$9EE610,$7F,LDA $100,SP,0100,存储器存储器寻址,这类指令将将一个存储单元的内容传送到另一个存储单元,其中至少有一个地址是在0页存储器存储器寻址有4种:立即寻址到直接寻址(IMD)直接寻址到直接寻址(DD)自动变址寻址到直接寻址(IX+D)直接寻址到自动变址寻址(DIX+),立即寻址到直接寻址(IMD)和直接寻址到直接寻址(DD),立即寻址到直接寻址方式(IMD):三字节指令,第一个字节为操作码,第二字节为立即数,第三字节为8位地址,MOV #$FF, $00;立即数$FF送$00单元,源,目的,直接寻址到直接寻址方式(DD):三字节指令,第一个字节为操作码,源操作数和目的操作数都是直接地址,MOV $60, $00;$60单元内容送$00单元,源,目的,这类指令通常用于初始化寄存器和变量,如MOV #$FF, PTA,由于直接地址是8位,这两种寻址方式只能实现0页内的传送,自动变址寻址到直接寻址(IX+D),双字节指令,第一字节是操作码,第二字节为目的地址,源操作数是16位变址寄存器H:X,将H:X所指向单元内容送目的存储器地址单元,然后H:X中的值自动加1,指向下一单元,$7F,LDHX #$0100,MOV X+, $40,$66,LDA #$7FSTA $0100LDA #$66STA $0101LDHX #$0100MOV X+,$40MOV X+,$41,立即寻址,扩展寻址,立即寻址,扩展寻址,扩展寻址,自动变址到直接寻址,可实现64k内任一地址到0页内的直接传送,直接寻址到自动变址寻址(DIX+),双字节指令,第一字节是操作码,第二字节为源操作数8位地址,目的操作数是16位变址寄存器H:X,将将源操作数地址存储单元内容送到H:X所指向单元,然后H:X中的值自动加1,指向下一单元,$7F,LDHX #$0240,MOV $40,X+,MOV #$7F,$40MOV #$66,$41LDHX #$0240MOV $40,X+MOV $41,X+,立即寻址到直接寻址,扩展寻址,直接寻址到自动变址,可实现0页向64k内任一地址的直接传送,$66,程序执行过程,LDHX #$40MOV #$44,$40LDA #$55ADD ,XSTA $100BRA $,8000,45,8001,00,8002,40,8003,8006,8008,8009,相对寻址(REL),相对寻址用于转移指令。计算机运行时程序计数器PC总指向下一条待执行指令的地址在相对寻址方式中,CPU首先测试给定的条件,如果满足条件,则发生相对转移将当前程序计数器PC的值加上指令码所占字节数,再加上指令操作码后的8位有符号数,使程序转移到PC指定的新地址处,否则执行该指令的下一条指令。相对寻址方式的指令为双字节指令,一个为操作码,另一个是相对偏移量,转移范围为相对于存放机器码地址的-126+129用户在编汇编语言程序时,不必自己计算相对偏移量,只要写出待跳转的地址标号代替偏移量,汇编程序会在汇编时自动计算偏移量,并检查是否超过有效转移范围,相对寻址例,main: CLC;设置进位标志位C为0 BCC P1 ;如C为0,转P1 LDA #$FF;(A)$FF BRA P2;无条件转P2P1: LDA #$00;(A) $00P2: BRA $ ;原地踏步,98 CLC 2404 BCC *+68003 A6FF LDA #0xFF8005 2002 BRA *+48007 A600 LDA #0x00 20FE BRA *+0800B 000000 BRSET,地址 代码 指令,相对寻址说明,98 CLC 2404 BCC *+68003 A6FF LDA #0xFF8005 2002 BRA *+48007 A600 LDA #0x00 20FE BRA *+0800B 000000 BRSET,地址 代码 指令,8001 2404 BCC *+6 24为操作码,04为偏移量PC总指向下一条待执行指令,因此当执行本条转移指令BCC P1时,PC正指向8003,即(PC)=8003,如转移条件满足,8003加上偏移量04,PC的新值为8007,即PC指向8007,正是符号地址P1待跳转的地址至于BCC *+6,则是BCC P1编译后的源码书写格式,“*”或“$”表示当前指令位置,不要与机器码2404混淆,P1:,P2:,8009 20FE BRA *+0 BRA为无条件转移指令,20为操作码,偏移量$FE是-2的补码,执行本条指令时PC已指向800B,800B-2=8009,PC又指向8009,实现原地跳转,不继续往下执行或者说*+0表示当前指令位置不变,PC,相对寻址执行过程,CLC BCC P1; 2404 LDA #$FF BRA P2P1: LDA #$00P2: BRA $,8000,8001,C=0,8003,8007,8003+04=8007,无偏移量变址后加1寻址,在MHC08指令系统中,只有一条指令采用这种寻址方式,这是一条相对转移指令:CBEQ X+,rel如H:X所指向的存储单元中的值和累加器A的值相等则转移,否则顺序执行下一条指令。但无论转移或不转移H:X的值都自动加1同样,编程时无需计算偏移量,写成程序标号即可,$0201,8位偏移量变址后加1寻址,在MHC08指令系统中,只有一条指令采用这种寻址方式,这是一条相对转移指令:CBEQ opr,X+,rel先将8位偏移量opr与H:X所指向的存储单元中的值相加,所得和为地址的存储单元中的值和累加器A的值相等则转移,否则顺序执行下一条指令。但无论转移或不转移H:X的值都自动加1同样,编程时无需计算偏移量,写成程序标号即可,$0200,$0201,寻址方式小结,隐含寻址(INH)立即寻址(IMM)直接寻址(DIR)扩展寻址(EXT),寻址方式例,指令表,A 累加器,CCR 条件寄存器,dd 直接寻址方式操作数,hh ll扩展寻址方式操作数的高位和低位,ee ff 16位偏移量变址寻址的高位和低位,M 存储器位置,opr 操作数,PC 程序计数器,rel PC相对转移字节,数据传送指令,16位传送,LDHX #$023F,LDHX $40,AA BB,02 3F,STHX $40,AA BB,数据传送指令_寄存器间传送,例:设置栈顶LDHX #$023FTXS,数据传送指令_堆栈,AA,$0100,$00FF,BB,$00FE,$00FE,BB,AA,$00FF,$0100,PUSHHPUSHX,SP总是指向栈顶堆栈操作永远是对栈顶操作进栈:先进栈,SP-1出栈:先SP+1,数据出栈,PULXPULH,存储器间传送指令,LDHX #$0100 MOV #$AA,$40 MOV $40,X+,算术类指令,加法指令ADD:不带进位加ADDC:带进位加,LDA #$88ADD #$88,大多数算术指令中的一个操作数隐含是累加器,运算结果也保存在A,A:10001000 10001000,00010000,1,A,CCR,C:,上电复位状态,加法指令,LDA #$FFADC #$01,运行后:V=0 H=1 N=0 Z=1 C=1,A:11111111 00000001+,00000001/0,1,A,C:,C=1/0,LDA #$FFINCA,运行后:A=0V=0 N=0 Z=1 但 C和H不变这是ADD #$1和INC指令不同之处,取反指令和比较指令,取反指令:LDA #-$1 ; 注意CodeWarrior ; 负数书写格式 COMA ;$FF-($FF)=0 A,MOV #$AA,$80COM $80 ; $55$80,比较指令:比较指令将两个操作数(其中一个是(A、X或(H:X)作了一次减法,但仅影响标志位,两个操作数都不变,MOV #$AA,$80LDA #$AACMP $80 ;$AA-$AA=0,所以Z=1,说明相等,16位比较:MOV #$12,$80MOV #$34,$81LDHX #$1200CPHX $80 ; (H:X)=$1200,($80)=$12,($81)=$34 ;$1200-$12340, N=1,C=1,Z=0 说明 ; 两数不等,且(H:X)($80)($81),算术指令,符号位的扩展_AIS,AIX,计算机中符号数以补码形式表示最高位位符号位:1 (00000001)2 (01)161 (11111111)2 (FF)168位符号数(-128,+127)扩展为16位,就是将符号位扩展到高8位中1 (00000000000000001)21 (11111111111111111)2,SP设置只能由H:X传送,立即数只能是8位符号数,AIX #opr8H:X(H:X)+(16M);-128=#opr8=127,逻辑运算指令,逻辑运算类指令都是对累加器A和另一操作数按位进行,结果返回A,位操作指令,位测试指令BIT:计算机进行BIT指令时实际是对累加器A和操作数进行了一次AND运算,与AND的区别是“与”运算结果不存入累加器A,因此两个操作数都不变,仅改变标志位。,清位:BCLR n,addr8MOV #$FF,$80 ;($80)=11111111BCLR 0,$80 ; ($80)=11111110,由于是直接寻址addr8,因此只能0页寻址,对存储器前256个单元操作,其位操作空间位25682048。指令中n=07,不影响任何标志位,置位:BSET n,addr8,清/置标志位C:CLC C0 SEC C1,清/置位中断屏蔽位:CLI I0 开中断SEI I1 关中断,第0位,算术移位指令,算术左移ASL和逻辑左移LSL,相当操作数2,1 0 0 0 0 0 0,0,C,A,ASLA,算术右移ASR,相当操作数2,右移时符号位复制以保持数值符号不变,1 0 1 1 1 1 1,0,C,A,ASRA,1,(01000000)2=64, 642=128=(10000000)2,(10111110)2=-66, -66/2=-33=(11011111)2,循环左移指令,循环左移ROL,进位位C与操作数作为整体循环移位,1 0 0 0 0 0 0,0,C,A,ROLA,ASLA,1,0 0 0 0 0 0 0,1,C,0,0 0 0 0 0 0 1,ROLA,跳转指令,跳转指令,无条件转移指令,条件转移指令,相对转移指令绝对转移指令,测试状态标志条件转移指令测试外中断(IRQ)条件转移指令位测试转移指令减1不为0转移指令比较相等转移指令,调用子程序指令,相对调用指令绝对调用指令,返回指令,从子程序返回指令从中断返回指令,除位测试转移指令外,所有转移指令不影响标志位,位测试转移指令,位测试转移指令将测试位送标志位C,然后判断转移。M:存储器位置,rel相对转移数,位测试例1,MOV #%01000000,$40 BRCLR 6,$40,P1 LDA #$FF BRA P2P1: LDA #$00P2: BRA $,$40单元位60?,y,n,P1:A$FF,P2:A$00,相对转移和绝对转移,BRA P1 ; 24 04 LDA #$FF BRA P2P1: LDA #$00P2: BRA $,8000,8002,8006,BRA rel: (PC)+relPC,绝对转移指令JMP:PC跳转地址,相对和绝对转移指令,JMP P2ORG $8110 P2: LDA #$AA,8000 CC8110 JMP 0x8110 . . .8110 A6AA LDA #0xAA,BRA P2ORG $8110 P2: LDA #$AA,8000 200E BRA *+16 ;abs=8010 . . .8110 A6AA LDA #0xAA,比较ORG $8080、$8081、$8082等情况,减1不为0转移指令,DBNZA rel:A(A)-1 PC(PC)+3+rel, ?(result)0,LDX #$0 LDA #$3P1: INCX DBNZA P1,延时程序: LDA #$3 DBNZA $,思考:A=? 可得到最大延时CLRA,MOV #$2,$40P: LDA #$3P1: NOP DBNZA P1 DBNZ $40,P,思考:NOP执行了几次?,转子程序和返回指令,相对和绝对转移调用子程序指令,JSR P2ORG $8110 P2: LDA #$AA RTS,CD8110 JSR 0x81108003 20FE BRA *+0 ;abs=8003 . . . A6AA LDA #0xAA8112 81 RTS,BSR P2ORG $8110 P2: LDA #$AA RTS,AD0E BSR *+16 ;abs=80108002 20FE BRA *+0 ;abs=8003 . . . A6AA LDA #0xAA8112 81 RTS,比较ORG $8080、$8081、$8082等情况,转子程序和返回过程,MAIN: 8000 45023F LDHX #$023F 8003 94 TXS 8004 AD02 BSR SUB_P 8006 20FE BRA $,SUB_P: 8008 9D NOP 8009 81 RTS,uu,uu,uu,uu,uu,023E,堆栈将返回地址8006弹出到PC,程序从中断处8006继续执行,8006进堆栈保护,SP-2子程序首地址8008进PC,开始执行子程序程序,023C,uu,06,80,十进制调整和半字节交换指令,BCD数78+35=113LDA #$78ADD #$35 ;(A)=$ADDAA ;(C)=1,(A)=13减法不能用DAA,LDA #$74NSA ;(A)=47,MOV #$74,$80LDA $80AND #$0FSTA $82LDA $80NSAAND #$0FSTA $81BRA $,NSA经常用于BCD码的处理例:将压缩BCD转换成非压缩BCD码,7 4,0 4,7 4,4 7,0 7,NSA,January 6, 2018,程序设计基础,汇编语言程序格式,机器语言:用二进制编码和储存的机器指令(机器码),汇编语言:用助记苻表示指令的功能和特征代替机器指令。由于机器只能识别机器码,汇编语言源程序只有经汇编后生成机器语言的目标程序才能运行,汇编语言源程序格式:标号:操作码 操作数 注释LOOP : LDA 0,X ;X变址寻址置送累加器A,标号 标号有两种形式: (1) 标号的第一个字符是“*”时,表示该行是注释行,汇编程序忽略注释行。 (2) 可执行语句标号的第一个字符必须是英文字母,后面可接英文字母数字、美元苻$和下划线_。标号区分大小写。标号在此起符号地址的作用,表示转移语句的转向地址或程序的起始地址或数据地址。 标号后的“:”不是必须的,汇编语言源程序格式,操作码操作码分两类指令码伪指令码,由汇编程序用于控制汇编操作,不是执行指令,操作数操作数部分指明了指令的寻址方式和操作数,操作数可由符号、表达式组成,各部分由“,”分割,汇编语言中的表达式,表达式由符号、常数、运算符和括号组成。表达式的运算结果为操作数。表达式可由运算符、*、/、&、|、等连接苻号和常数或字符“*”(表示当前PC的值,也可用“$”),MC68HC08允许使用的运算符及其功能,STA $80+$10 ;编译后 STA 0x90STA $90%$90 ;编译后 STA 0x00STA $80$01 ;编译后 STA 0x81,LDA TAB+1,XBRA *TAB: FCB $AA,$BB,伪操作指令,汇编语言有一类不与任何处理器指令对应的伪指令,它们为汇编程序将符号指令编译成机器码提供信息:地址、数据、定位和分段等,伪指令不生成代码。,赋值伪指令: 标号:EQU 注释如: coefficient EQU 5 ;系数为5 DDRA EQU $0004 ; A口方向寄存器地址 将常用的地址或数值用EQU定义为一个符号有助于阅读和修改定位伪指令: ORG 注释如: ORG $8100 源程序或数据编译后存放在$8100开始的存储空间,结束伪指令:END表示本汇编程序到此结束,常数定义伪指令,ORG $80Table: FCB ABC,$AA, $BBTable1: FDB $023F, $AA ORG $8030Table_C: FCC ABmain:Entry: LDA Table2 MOV Table+4,$90 ORG $8010Table2: FCB $E1, $50, $01 END,DB 或FCB: 定义字节和字符串 DW或FDB: 定义字。 DC或FCC: 定义字符串,如用FCC, 一句只能定义一个字符串,程序汇编后:41 42 43 AA BB 85 02 3F 00 AA 41 428010 E1 50 01,程序运行后:A=E1,($90)=BB,思考:可否 LDHX Table1,存储区域保留伪指令,DS 或RMB:() RMB ;也可用DS从标号位置起保留一块存储区,其字节长度等于表达式的值。汇编后将存储区初始化为0可用RMB.B和RMS.W分别表示后面保留的存储区以字节或字(双字节)作单位DS.B 3 保留3字节DS.W 3 保留6字节,ORG $80Sum1: RMB 3Sum2: RMB 1 Table: FCB $AA,$BBmain:Entry: MOV #$2,Sum1 MOV #$3,Sum2 BRA $ END,汇编后0080 00 00 00 00 AA BB运行后0080 02 00 00 03 AA BB,汇编语言程序设计,简单程序_单字节16进制数转换为BCD码,254/100=25454/10=54,H A,00,254,100,X,54,2,B1 DS.B 1B2 DS.B 1B3 DS.B 1 LDA #254 CLRH LDX #100 DIV ;分离百位 STA B1 LDX #10 ;余数分离十位和个位 PSHH PULA CLRH DIV STA B2 PSHH PULA STA B3 BRA *,2,B1,00,54,用堆栈传送数据,00,54,10,4,5,5,B2,4,B3,;用堆栈实现AH,;用堆栈实现H内容;送存储器,简单程序_单字节BCD整数转换成单字节十六进制整数,LDA #%10011000 ;(98)BCDCLRHLDX #16DIV ;分离十位和个位PSHH ;个位进栈LDX #10MUL ;将十位转换为十六进制ADD 1,SP ;加个位BRA *,BCD数98在计算机中存放形式为10011000即$98对98=9*10+8 ; 对$98=9*16+8算法为:$98/16=98实际数值为9*10+8,H A,00,$98,16,X,8,9,9,10,8,十进制和16进制权不同,简单程序_将压缩BCD码拆开转换为ASCII码,ORG $80Data_BCD DS.b 1Data_ASCII DS.b 2 LDHX #$0010 LDA Data_BCD DIV ORA #$30 STA Data_ASCII PSHH PULA ORA #$30 STA Data_ASCII+1 BRA *,采用除$10方法(相当于右移4位)将BCD数拆开,H,A,A,H,X,* 用半字节屏蔽方法编程,比较程序字节数、执行周期数,简单程序_双字节求补,ORG $80DATAH FCB $00DATAL: FCB $01main:Entry: BSR DNEG BRA *DNEG:NEGDATAL; 00-DATALCLRASBCDATAHSTADATAHRTS,算法1:0DATADATA,算法2:取反加1 main:Entry: BSR DNEG BRA *DNEG: COM DATAH ;取反高位 LDA DATAL COMA ;取反低位 ADD #$1 ;双字节加1 STA DATAL CLRA ADC DATAH STA DATAH RTS,分支程序_简单分支程序,ORG $0080Data1: FCB $12Data2: FCB $34code sectionMyCode: SECTIONmain:Entry: LDA Data1 CMP Data2 BHI CMP_End MOV Data2,Data1 STA Data2CMP_End: BRA

温馨提示

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

评论

0/150

提交评论