汇编语言程序设计课件_第1页
汇编语言程序设计课件_第2页
汇编语言程序设计课件_第3页
汇编语言程序设计课件_第4页
汇编语言程序设计课件_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言程序设计2. 80C51汇编程序设计中常用的伪指令v(1)ORG 汇编起始指令 v规定目标程序的起始地址,格式如下: 标号 操作码 操作数v ORG 表达式(exp)必须为16位地址v(2) EQU 赋值指令v把操作数段中的地址或数据赋值给标号,格式如下: v标号 操作码 操作数v字符名称 EQU 数或汇编符号 v例1 AA EQU R1 ;R1与AA等值v 则 MOV A, AA 指令与 MOV A,R1指令结果相同。汇编语言程序设计(3)DB(3)DB 从指定单元开始定义(存储)若干个字节的数从指定单元开始定义(存储)若干个字节的数据或据或ASCIIASCII码字符,常用于定义码字

2、符,常用于定义8 8位数据常数表。位数据常数表。格式:格式: 操作码操作码 操作数操作数 DB DB 字节常数或字节常数或ASCIIASCII字符字符例例: :ORGORG 1000H 1000HDBDB34H34H,7373,AA,BBDBDB0AH0AH,0BH0BH,2020则则 (1000H1000H)34H 34H (1001H1001H)49H 49H (1002H1002H)41H 41H (1003H1003H)42H 42H (1004H1004H)0AH 0AH (1005H1005H)0BH0BH (1006H1006H)14H 14H 汇编语言程序设计(4) DW 定义

3、字指令 定义程序存储器中存放的若干个字的数据或ASCII码字符16位常数表格式 DW。v例3 ORG 2200Hv DW 1246H,7BH,10v 则 (2200H)12H (2201H)46Hv (2202H)00 (2203H)7BHv (2204H)00 (2205H)0AHv(5) BIT 定义位地址指令 v 格式 BITv 例4 ABC BIT P1.0v Q4 BIT P2.2v 则汇编后,位地址P1.0,P1.2分别赋给变量ABC和Q4。v(6) END 汇编结束指令汇编语言程序设计(7) DATA定义标号数值为指令定义标号数值为指令 格式:格式: 标号标号 操作码操作码 操作

4、数操作数 符号名称符号名称 DATA 表达式表达式如如 MN DATA 3000H ;MN相当于相当于3000HDATA与与EQU的区别在于前者可以先使用后定义而的区别在于前者可以先使用后定义而后者不行,必须先定义才能使用。后者不行,必须先定义才能使用。(8)DS定义存储空间指令定义存储空间指令 功能:从指定地址开始保留功能:从指定地址开始保留DS之后表达式的值所之后表达式的值所规定的存储单元。规定的存储单元。 格式:格式: 标号标号 操作数操作数 DS 表达式表达式例:例:P105 例例7汇编语言程序设计5.2.25.2.2 循环程序循环程序包含多次重复执行的程序段,循环结构使程序紧凑。包含

5、多次重复执行的程序段,循环结构使程序紧凑。循环控制 ?循环工作循环结束循环初始化YN各个环节任务:各个环节任务:一一初始化部分(循环初态)初始化部分(循环初态)循环准备工作。如:清结果单元、循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。设指针、设循环控制变量初值等。二二循环体循环体循环工作部分:循环工作部分:需多次重复处理的工作。需多次重复处理的工作。循环控制部分:循环控制部分:1.1.修改指针和循环控制变量。修改指针和循环控制变量。2.2.检测循环条件:满足循环条件,继续循环,否则退出循环。检测循环条件:满足循环条件,继续循环,否则退出循环。三三. .结束部分结束部分 处理和保

6、存循环结果。处理和保存循环结果。允许允许0 0次循环的循环结构:在循环工作之前检测循环条件。次循环的循环结构:在循环工作之前检测循环条件。汇编语言程序设计简单循环结构:循环体中不套循环简单循环结构:循环体中不套循环。例例2 2:试计算下列程序段执行时间。:试计算下列程序段执行时间。 程序程序 指令执行周期指令执行周期 MOV R7MOV R7, #64H #64H 1T1TLOOPLOOP:NOP NOP 1T1T NOP NOP 1T1T DJNZ R7 DJNZ R7, LOOP LOOP 2T2T解:上述程序显然属于循环程序,其算法结构解:上述程序显然属于循环程序,其算法结构如图所示。循

7、环次数如图所示。循环次数100100次,根据每条指令的次,根据每条指令的执行周期可得每次循环消耗执行周期可得每次循环消耗1+1+2=41+1+2=4(机器周(机器周期),加上第一条指令,整个程序段共计消耗期),加上第一条指令,整个程序段共计消耗时间为(时间为(4 4100+1100+1)T= 401TT= 401T,当晶振频率为,当晶振频率为6MHZ6MHZ时,时,T=2sT=2s,故上述程序实际消耗,故上述程序实际消耗802s802s。汇编语言程序设计多重循环多重循环循环体中套循环结构。以双重循环使用较多。循环体中套循环结构。以双重循环使用较多。软件延时程序。软件延时程序。用循环程序将指令重

8、复多次执行,实现软件延时。用循环程序将指令重复多次执行,实现软件延时。v试计算延时程序的执行时间。试计算延时程序的执行时间。v源程序源程序指令周期指令周期(M) (M) 指令执行次数指令执行次数DELAYDELAY:MOV R6MOV R6,#64H#64H1 1I1I1: MOV R7MOV R7,#0FFH#0FFH1 1I2I2: DJNZ R7DJNZ R7,I2I22 2 DJNZ R6 DJNZ R6,I1I12 2 RET RET2 2延时时间计算:(设时钟延时时间计算:(设时钟f=12MHzf=12MHz,M=1sM=1s)t=(1t=(11+11+1100+2100+2100

9、100255+2255+2100+2100+21)1)M=51.3 msM=51.3 ms1 11001001001002552551001001 1汇编语言程序设计习题:习题:试计算延时程序的执行时间。试计算延时程序的执行时间。源程序源程序指令周期指令周期(M) (M) 指令执行次数指令执行次数DELAYDELAY:MOV R6MOV R6,#100#1001 1D1D1: MOV R7MOV R7,#10#101 1D2D2: NOPNOP1 1 DJNZ R7DJNZ R7,D2D22 2 DJNZ R6 DJNZ R6,D1D12 2 RET RET2 2计算延时程序的执行时间计算延时

10、程序的执行时间( (设时钟设时钟f=6MHz)f=6MHz)。汇编语言程序设计53 分支程序设计v5.3.1 分支程序设计综述v分支程序应用要点是正确使用转移指令,通常有如下3种指令。 v1. 无条件转移:与以执行程序的结果无关,只要给出正确的转移目标地址或偏移量即可 v2. 条件转移 :根据已执行程序对特殊或特定存储器的影响结果来决定程序的走向。v3. 散转:根据某种已输入的或运算的结果,是程序转到各个处理程序中 汇编语言程序设计例3 设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元vY= 3X , X 10vY= 2X +10 , 10= X 155.3.2 无条件

11、/条件转移程序 汇编语言程序设计 ORG 200H MOV A,5AH ADD A,5AH ;2XA MOV R1,A MOV A,5AH ;重新把X装入A CJNE A,#10,L1L1: JC L2 ;X15 CJNE A,#10H,L3 ;与16比L3: JNC L4 ;X15转L4 MOV A,R1 ADD A,#10 ;10X15,Y2X10汇编语言程序设计 MOV R0,A SJMP L4L2: MOV A,R1 ADD A,5AH ;X10,Y=3X MOV R0,AL4 : MOV 5BH,R0 ;存结果 SJMP $ END汇编语言程序设计空调机制冷时,若排出的空气温度比吸入

12、的空气空调机制冷时,若排出的空气温度比吸入的空气 温度低温度低8则认为工作正常,否则便认为是故障,则认为工作正常,否则便认为是故障, 并设置故障标志。并设置故障标志。为了可靠的监控空调机的工作情况,做两次减法:为了可靠的监控空调机的工作情况,做两次减法:第一次(第一次(40H)-(41H),若),若CY=1 ,则肯定有故障;,则肯定有故障;第二次两个温度的差值减去第二次两个温度的差值减去8 ,若,若CY=1 ,则肯定,则肯定有故障有故障程序的流程图如下:程序的流程图如下:首先定义一些工作单元首先定义一些工作单元内部内部RAM40H41H42H吸入温度值吸入温度值排出温度值排出温度值故障标志故障

13、标志汇编语言程序设计A(40H)-(41H)CY=1?(A)-8ENDSTART Y NCY=1?42HFFH42H0 Y N流程图:流程图:故故 障障正常正常汇编语言程序设计 ORG 1000HSTART:MOV A,40HCLR CSUBB A,41HJC ERRORMOV 42H,#0JC ERRORSUBB A,#8SJMP EXITERROR:MOV 42H,#0FFHEXIT: SJMP $END程序:程序:;吸入温度值送;吸入温度值送A; 0 CY; A(40H)-(41H);CY=1,则故障,则故障;是则故障是则故障;温度小于温度小于8?;工作正常标志工作正常标志;转出口转出口

14、;设置故障标志设置故障标志若若CY1顺顺序执行序执行CY=1转转移移CY=1转转移移若若CY1顺顺序执行序执行汇编语言程序设计5.3.3 散转程序设计 v 例5 根据R3的内容,转向各个操作程序。v R30, 转入OPR0v R31, 转入OPR1.v R3n, 转入OPRnv 解:程序清单如下。v MOV DPTR,TAB1 ;跳转表首地址送数据指针v MOV A,R3 ;R32 A(修正变址值)v ADD A,R3v JNC NOAD ;判有否进位v INC DPH ;有进位则加到高字节地址vNOAD: JMP ADPTR ;转向形成的散转地址入口vTAB1: AJMP OPR0 ;转移到

15、OPR0v AJMP OPR1. v AJMP OPRn汇编语言程序设计5.4 5.4 查表程序查表程序对于复杂参数的计算如对于复杂参数的计算如:非线性参数非线性参数对数、指数、三角函数对数、指数、三角函数微分、积分等微分、积分等用汇编编程十分困难用汇编编程十分困难甚至无法建立数学模型甚至无法建立数学模型用用查表查表的方法简单容易的方法简单容易80C51指令系统中有两条指令具有极强的查表功能指令系统中有两条指令具有极强的查表功能(1) MOVC A,A+DPTR作作基址寄存器基址寄存器作作变址寄存器变址寄存器长查表指令长查表指令寻址寻址64KB(2) MOVC A,A + PC作基址寄存器作基

16、址寄存器作变址作变址短查表指令短查表指令页内查表指令页内查表指令指向表格首址指向表格首址指向表格的第指向表格的第 i 项项16位数据指针位数据指针第第i项加项加变址调整值变址调整值不能不能汇编语言程序设计例例6:一个十六进制数放在一个十六进制数放在HEX单元的低四位单元的低四位,将其转换成将其转换成ASCII码码 查表程序:查表程序:解:解:十六进制十六进制 09 的的ASCII码为码为 30H39H, AF 的的ASCII码为码为 41H46H, 利用查表指令利用查表指令 MOVC A,A+DPTRMOVC A,A+PC先用伪指令先用伪指令 DB 或或 DW 把表格的数据存入把表格的数据存入

17、ROM来获得数据来获得数据ASCII码表格的首址为码表格的首址为ASCIITAB汇编语言程序设计ASCTAB:DB 30H,31H,32H,33HDB 34H,35H,36H,37HDB 38H,39H,41H,42HDB 43H,44H,45H,46H END编程编程1: 0 1 2 3 4 5 6 7 8 9 A B C D E F ORG 0200HHEX EQU 30HHEXASC: MOV A,HEXMOV DPTR,#ASCTABMOVC A,A+DPTRMOV HEX,ARETANL A,#0FHDPTR(A)= 333H(A)= 1546H汇编语言程序设计例1 设计一个将16进

18、制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。vORG 30HvMOV A,R0vANL A,0FH ; 保留低4位vADD A,2 ;变址调整vMOVC A,APC;查表获取ASCII码值vMOV R0,AvRETvTAB:DB 30H,31H,32H,33H,34H,35HvDB 36H,37H,38H,39H,41H,42H,43H,44H,45H,46Hv 汇编语言程序设计5.5 子程序设计子程序设计一、子程序的概念一、子程序的概念把能完成某种基本操作并具有相同操作的程序段单独把能完成某种基本操作并具有相同操作的程序段单独 编成子程

19、序。编成子程序。如:函数、如:函数、 运算、代码转换、延时等运算、代码转换、延时等利用调用子程序指令(利用调用子程序指令(ACALL或或LCALL)和从子程序返)和从子程序返回指令回指令RET使用子程序的优点使用子程序的优点 不必重复书写同样的程序,提高编程效率不必重复书写同样的程序,提高编程效率 程序的逻辑结构简单,便于阅读程序的逻辑结构简单,便于阅读 缩短了源程序和目标程序的长度,节省了存储器空间缩短了源程序和目标程序的长度,节省了存储器空间 使程序模块化、通用化、便于交流共享资源使程序模块化、通用化、便于交流共享资源 便于按某种功能调试便于按某种功能调试汇编语言程序设计二、调用子程序的要

20、点二、调用子程序的要点 子程序开头的标号段必须有一个标志,该子程序开头的标号段必须有一个标志,该标志标志既是子程序既是子程序的的名字名字又是其又是其入口地址入口地址,以便主程序调用。,以便主程序调用。在主程序中利用指令在主程序中利用指令ACALL或或LCALL可转入子程序。可转入子程序。 该指令具有保护该指令具有保护断点断点的功能的功能例如:调用延时子程序例如:调用延时子程序LCALL(ACALL) DELY 子程序结尾必须使用一条从子程序返回指令子程序结尾必须使用一条从子程序返回指令RET,它具有恢复断点的功能它具有恢复断点的功能LCALL addr16LCALL addr16; PC ad

21、dr16 ; PC addr16 转向子程序转向子程序;(PC(PC) (PCPC)+3+3;SP (SP)+1SP (SP)+1,(SP),(SP) PC7 PC70 0;SP (SP)+1,(SP) SP (SP)+1,(SP) PC15PC158 8;在调用子程序之前,保护;在调用子程序之前,保护断点地址断点地址RETRET; PC15PC158 (SP) ,8 (SP) ,(SPSP) (SPSP) -1-1; PC7PC70 (SP) ,0 (SP) ,(SPSP) (SPSP) -1-1主程序主程序CALL断点断点子程序子程序RET1、子程序的结构、子程序的结构子程序特点:功能上有

22、通用性,结构子程序特点:功能上有通用性,结构上有独立性上有独立性汇编语言程序设计2、正确的参数传递、正确的参数传递 在调用一个子程序时,主程序应先把有关参在调用一个子程序时,主程序应先把有关参数放到某些约定的位置(如累加器、工作寄存器数放到某些约定的位置(如累加器、工作寄存器等),子程序运行时,可以从约定的位置得到有等),子程序运行时,可以从约定的位置得到有关参数。子程序结束前,也应把处理结果送到约关参数。子程序结束前,也应把处理结果送到约定位置定位置3、子程序的通用性、子程序的通用性 为了使程序具有一定的通用性,子程序的操为了使程序具有一定的通用性,子程序的操作对象应尽量采用地址或寄存器形式

23、,而不用立作对象应尽量采用地址或寄存器形式,而不用立即数形式。即数形式。汇编语言程序设计4、现场保护、现场保护 如果子程序使用的寄存器与主程序使用的寄存器如果子程序使用的寄存器与主程序使用的寄存器 有冲突,在转入子程序前,特别是进行中断服务有冲突,在转入子程序前,特别是进行中断服务 子程序时,要进行现场保护。子程序时,要进行现场保护。主程序使用的内部主程序使用的内部 RAM 内容,各工作寄存器内容,内容,各工作寄存器内容,累加器累加器 A 和和 DPTR 以及以及 PSW 等寄存器内容。等寄存器内容。将要保护的单元压入堆栈。将要保护的单元压入堆栈。中断保护时中断保护时:还可以用还可以用 RS1

24、 RS0 来选择其他通用寄存器组,来选择其他通用寄存器组, 以便保护主程序现场。以便保护主程序现场。R0 R7汇编语言程序设计5.5.2 子程序设计 v例1 用程序实现c a2b2。设a、b均小于10。a存在31H单元中,b存在32H单元,把c存入33H单元。v 解:因本题二次用到平方值,所以在程序中采用把求平方的程序段编为子程序的方法。依题意编写主程序和子程序如下:汇编语言程序设计 地址 机器码 源程序 ORG 200H 200 75 81 3F MOV SP,3FH ;设堆栈指针 203 E5 31 MOV A,31H ;取a值 205 12 04 00 LCALL SQR ;求a2 20

25、8 F9 MOV R1,A ;a2值暂存R1 209 E5 32 MOV A,32H ;取b值 20B 12 04 00 LCALL SQR ;求b2 20E 29 ADD A,R1 ;求a2b2 20F F5 33 MOV 33H,A ;存入33H 汇编语言程序设计v; 子程序v 地址 机器码 源程序v ORG 400Hv 400 04 SQR: INC Av 401 83 MOVC A,APCv 402 22 RET v403 1 4 9 16 TAB: DB 0,1, 4, 9,16 v408 25 36 49 DB 25,36,49v40B 64,81 DB 64,81汇编语言程序设计

26、子程序的嵌套子程序的嵌套 子程序中可调用其他子程序子程序中可调用其他子程序 数据处理程序如下数据处理程序如下.MAIN: MOV SP, #5FACALL RLC4.;定义堆栈指针定义堆栈指针;处理过程处理过程;调用子程序调用子程序;汇编语言程序设计多重嵌套的过程多重嵌套的过程SPSP *PC0L *PC0H *PC1L*PC1H5FH60H61H62H63H64H65H*PC2H*PC2L 断点入栈断点入栈断点入栈断点入栈SPSP断点断点入栈入栈SPSPSPSP弹出断点弹出断点弹出断点弹出断点SPSP弹出断点弹出断点SPSP栈栈 底底 子程序与主程序的概念子程序与主程序的概念是相对的,在一个

27、子程序中是相对的,在一个子程序中又可调用其它子程序,这就又可调用其它子程序,这就是子程序的多重嵌套。是子程序的多重嵌套。堆栈的设置是十分重要的堆栈的设置是十分重要的汇编语言程序设计 多字节无符号数减法子程序多字节无符号数减法子程序NSUB(R0)=被减数低字节指针(被减数低字节指针(R1)=减数低字节指针减数低字节指针(R7)= 字节数字节数n(R0)=差数高字节地址指针差数高字节地址指针若被减数大于减数,则差为正数;若被减数小于若被减数大于减数,则差为正数;若被减数小于 减数,则差为补码数(负数),且差数为减数,则差为补码数(负数),且差数为n字节字节5.6 5.6 综合编程举例综合编程举例

28、 汇编语言程序设计流程图:流程图:0CY (R0)-(R1)-CY(R0)RETNSUB(R7)-1=0?修改地址指针修改地址指针(R0)+1R0,(,(R1)+1R1 NNSUB: CLR CLOOP: MOV A,R0 NOP MOV R0, ASUBB A, R1INC R0INC R1DJNZ R7, LOOPDEC R0RET程序:程序:汇编语言程序设计 双字节无符号数快速乘法子程序双字节无符号数快速乘法子程序MULD(R7R6)= 被乘数被乘数ab(R5R4)= 乘数乘数cd(R0)= 有定义的内部有定义的内部RAM地址地址(R0)= 乘积的高字节地址指针乘积的高字节地址指针于两个双字节无符号数相乘,用于两个双字节无符号数相乘,用8位乘法指令来完成位乘法指令来完成需要四次,每次的乘积为需要四次,每次的乘积为16位,会产生位,会产生4个部分积,共需个部分积,共需要要8个单元存放,然后再按个单元存放,然后再按“位权位权”相加,和即为所求之相加,和即为所求之积。这样所占存储单元太多,应该采用边乘边加的方法。积。这样所占存储单元太多,应该采用边乘边加的方法。用用R3、R2、R1作暂存器或工作单元。作暂存器或工作单元。汇编语言程序设计 R6 R7 R4 R5 编程思路与手乘法相似:编程思路与手乘法相似:

温馨提示

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

评论

0/150

提交评论