1、第五章第五章 汇编语言程序设计汇编语言程序设计5-1 概述概述5-2 顺序与循环程序设计顺序与循环程序设计5-3 分支程序设计分支程序设计5-4 查表程序设计查表程序设计5-5 子程序设计子程序设计5-6 综合编程举例综合编程举例ENDThank you 5-1 概述概述一、程序设计语言1 1机器语言机器语言2 2汇编语言汇编语言3 3高级语言高级语言二、汇编语言的规范1汇编语言源程序的格式标号:操作码 操作数 ;注释LP:MOV A,20H ;20HA 源程序源程序(汇汇编编语语言言程序)程序)汇编程序汇编程序(完完成成把把源源程程序序翻翻译译成成目目的的程程序序的工作)的工作)目的程序目的
2、程序(机机器器语语言言程程序序))2汇编语言伪指令 n n控制汇编用的特殊指令,这些指令不属于指令控制汇编用的特殊指令,这些指令不属于指令系统,系统,不产生机器代码不产生机器代码,因此称为伪指令或汇,因此称为伪指令或汇编指令编指令 1 1)ORG(origin)ORG(origin)ORG ORG 表达式表达式(exp)(exp)expexp必须是必须是1616位的地址值或标号。位的地址值或标号。如:如:ORG 0000HORG 0000H LJMP START LJMP START ORG 0100H ORG 0100HSTART:START:2)END 2)END 汇编语言程序结束伪指令,
3、用在程序的末尾,表示程序汇编语言程序结束伪指令,用在程序的末尾,表示程序已结束。汇编程序对已结束。汇编程序对ENDEND以后的指令不再汇编。以后的指令不再汇编。3)EQU(EQUATE)3)EQU(EQUATE)n n赋值赋值(也称等值也称等值)伪指令,它的作用是把操作数段中的伪指令,它的作用是把操作数段中的地址或数据赋值给标号字段中的标号。它的格式如下:地址或数据赋值给标号字段中的标号。它的格式如下:n n标号标号 (字符名称字符名称)EQU )EQU 数或汇编符号数或汇编符号n n例例:AA EQU R1AA EQU R1 ;R1R1与与AAAA等值等值 则则“MOV AMOV A,AA”
4、AA”与与“MOV AMOV A,R1”R1”等值。等值。n n例例:K1 EQU 40K1 EQU 40 DL EQU 0FA4CH DL EQU 0FA4CH MOV A MOV A,#K1#K1 ;4040A A LJMP DLLJMP DL ;FA4CHFA4CHPCPC4)DB(Define Byte)4)DB(Define Byte)定义字节伪指令,它的功能是从指定单元开始定定义字节伪指令,它的功能是从指定单元开始定义义(存储存储)若干个字节的数值或若干个字节的数值或ASCIIASCII码字符。码字符。常常用于定义数据常数表用于定义数据常数表 (建表建表)DB DB 字节常数或字节
5、常数或ASCIIASCII字符字符n n例例 ORG 1000HORG 1000HDB 76HDB 76H,7373,CC,BCBC ;在表示在表示ASCIIASCII字符字符 时需要用时需要用 或或“”“”括号括号DB 0ACHDB 0ACH则则 (1000H)(1000H)76H (1001H)76H (1001H)49H 49H (1002H)(1002H)43H (1003H)43H (1003H)42H 42H (1004H)(1004H)43H (1005H)43H (1005H)0ACH0ACH5)DW(Define Word)5)DW(Define Word)定义字伪指令,它的
6、功能是从指定单元开始定义定义字伪指令,它的功能是从指定单元开始定义(或或存储存储)若干个字的数据或若干个字的数据或ASCIIASCII码字符。码字符。n n例例4 ORG 2200H4 ORG 2200Hn nDW 1246HDW 1246H,7BH7BH,1010,abcdabcd 则则 (2200H)(2200H)12H (2201H)12H (2201H)46H46H (2202H)(2202H)00H (2203H)00H (2203H)7BH7BH (2204H)(2204H)00H (2205H)00H (2205H)0AH0AH (2206H)(2206H)61H (2207H)
7、61H (2207H)62H62H (2208H)(2208H)0FFH0FFH n n(6)BITn n位地址符号伪指令,它的功能是把位地址赋予所规定的字符名称。n n字符名称 操作码 操作数 BIT 位地址n n例5 ABC BIT P1.0 Q4 BIT P2.2注意:ABCD BIT 30H MOV A,30HBIT与EQU基本相同n n(7)DATA 定义标号数值伪指令,它的功能是给标号段中的标号赋以数值。标号 操作码 操作数字符名称:DATA 表达式例6 MN DATA 3000H注意:用DATA定义的标识符可以先使用后定义;而EQU定义的标识符必须先定义后使用。三、汇编语言程序设
8、计步骤n n(1)(1)熟悉与分析工作任务,明确其要求和要达到的熟悉与分析工作任务,明确其要求和要达到的工作目的、技术指标等。工作目的、技术指标等。n n(2)(2)确定解决问题的计算方法和工作步骤。确定解决问题的计算方法和工作步骤。n n(3)(3)画工作流程图画工作流程图n n(4)(4)分配内存工作单元,确定程序与数据区存放地分配内存工作单元,确定程序与数据区存放地址。址。n n(5)(5)按流程图编写源程序。按流程图编写源程序。n n(6)(6)上机调试、修改及最后确定源程序。上机调试、修改及最后确定源程序。n n编程原则:编程原则:程序简短和缩短运行时间程序简短和缩短运行时间 返回画
9、工作流程图返回5-2 顺序与循环程序设计顺序与循环程序设计n n顺序结构程序是一种最简单、最基本的程序。特点:是按程序编写的顺序依次执行,程序流向不变。n n循环结构程序(通常称其为循环体):需多次重复执行某段程序的情况,这种结构可大大缩短程序。顺序程序设计顺序程序设计循环程序设计循环程序设计返回顺序程序设计顺序程序设计n n例例1 1 将将20H20H单元的两个单元的两个BCDBCD码拆开并码拆开并变成变成ASCIIASCII码,存入码,存入21H21H、22H22H单元。单元。注意:注意:ASCIIASCII码码0 09 9为为30H30H39H39H。n n法一法一 :ORG 2000H
10、ORG 2000H MOV A MOV A,20H20H MOV B MOV B,10H10H;用;用10H10H作除数作除数 DIV ABDIV AB ORL B ORL B,30H30H;低;低4 4位位BCDBCD码变为码变为ASCIIASCII码码 MOV 22HMOV 22H,B B ORL A ORL A,30H30H;高;高4 4位位BCDBCD码变为码变为ASCIIASCII码码 MOV 21HMOV 21H,A An n法二:地地 址址 机器码机器码 周期数周期数 源程序源程序 ORG 2000HORG 2000H2000H 7822 1 2000H 7822 1 MOV R
11、0MOV R0,#22H#22H2002H 7600 1 2002H 7600 1 MOV MOV R0R0,#00#002004H E520 1 2004H E520 1 MOV AMOV A,20H20H2006H D6 1 2006H D6 1 XCHD AXCHD A,R0R02007H 432230 2 2007H 432230 2 ORL 22HORL 22H,#30H#30H200AH C4 1 200AH C4 1 SWAP ASWAP A200BH 4430 1 200BH 4430 1 ORL AORL A,#30H#30H200DH F52l 1 200DH F52l 1
12、 MOV 21HMOV 21H,A A ENDEND方法一占用字节数为16,执行总周期数为13。方法二占用字节数为15,执行总周期数为9。n n设有两个设有两个4 4位位BCDBCD码,分别存放在码,分别存放在23H23H、22H22H单元单元和和33H33H、32H32H单元中,求它们的和,并送入单元中,求它们的和,并送入43H43H、42H42H单元中去(以上均为低位在低字节,高位在高单元中去(以上均为低位在低字节,高位在高字节)。字节)。ORG 2000HORG 2000H CLR C CLR C MOV A MOV A,22H22H ADD A ADD A,32H 32H ;(22H)
13、(22H)十十(32H)(32H)A A DA ADA A ;BCDBCD码调整码调整 MOV 42HMOV 42H,A A ;存结果低位存结果低位 MOV AMOV A,23H23H ADDC A ADDC A,33H 33H ;(33H)(33H)十十(23H)(23H)十十C CA A DA ADA A MOV 43H MOV 43H,A A ;存结果高位存结果高位 LLLL:SJMP LL SJMP LL ;暂停暂停 ENDEND返回循环程序设计循环程序设计n n循环结构的程序一般包括以下几部分循环结构的程序一般包括以下几部分 n n1 1循环初态循环初态循环初态循环初态(或称初始条件
14、或称初始条件)是设置循环过是设置循环过程中工作单元的初始值。程中工作单元的初始值。n n2 2循环体循环体重复执行的程序段部分称循环体重复执行的程序段部分称循环体n n3 3循环控制部分循环控制部分该部分用于控制循环的执行和结束。该部分用于控制循环的执行和结束。单重循环程序单重循环程序 ,多重循环程序(循环嵌套,多重循环程序(循环嵌套 )不允许循环体互相交叉。另外,也不允许不允许循环体互相交叉。另外,也不允许从循环程序的外部跳入循环程序的内部从循环程序的外部跳入循环程序的内部。n n例例例例4 4:晶振频率为:晶振频率为6MHZ6MHZ,设计一延时程序,延时时设计一延时程序,延时时间为间为10
15、ms10ms。MOV R1,#DATAMOV R1,#DATA(此处是此处是0AH)0AH)DL2:MOV R0,#DTATA2DL2:MOV R0,#DTATA2(此处是此处是7DH=125)7DH=125)DL1:DL1:NOPNOPNOPNOPDJNZ R0,DL1DJNZ R0,DL1DJNZ R1,DL2DJNZ R1,DL2ENDENDn n(1+(1+1+2)*DATA2+2)*DATA+1)*MC=(1+(1+1+2)*DATA2+2)*DATA+1)*MC=延时时间延时时间=10062=10062微秒微秒n n例例6 6 从从22H22H单元开始有一无符号数据块,其长度在单元
16、开始有一无符号数据块,其长度在20H20H单元。单元。求出数据块中最大值,并存入求出数据块中最大值,并存入21H21H单元。单元。ORG 3000HORG 3000HCLR A CLR A MOV R2MOV R2,20H20HMOV R1MOV R1,22H22HCLR CCLR CSUBB ASUBB A,R1R1JNC NEXT JNC NEXT MOV AMOV A,R1R1SJMP NEXT1SJMP NEXT1NEXTNEXT:ADD AADD A,R1 R1 NEXT1NEXT1:INC R1 INC R1 DJNZ R2DJNZ R2,LP LP MOV MOV 21H21H,
17、A ALP1LP1:SJMP LP1SJMP LP1ENDEND返回5-3 分支程序设计分支程序设计一、分支程序设计综述一、分支程序设计综述1 1无条件转移无条件转移 它的程序转移方向是设计者事先安排的,与已执它的程序转移方向是设计者事先安排的,与已执行程序的结果无关,使用时只需给出正确的转移行程序的结果无关,使用时只需给出正确的转移目标地址或偏移量即可。目标地址或偏移量即可。2 2条件转移条件转移 1)1)在使用条件转移指令形成分支前,一定要安排在使用条件转移指令形成分支前,一定要安排可供条件转移指令进行判别的条件可供条件转移指令进行判别的条件 2)2)正确选定所用的转移条件和转移目标地址正
18、确选定所用的转移条件和转移目标地址3 3散散 转转二、无条件条件转移程序p92 ORG 30HORG 30H MOV A,5AH MOV A,5AH MOV B MOV B,A A MUL AB MUL AB MOV R1 MOV R1,A A MOV A MOV A,5AH5AH CJNE A,#10,L1 CJNE A,#10,L1L1L1:JC L2 JC L2 MOV R0 MOV R0,#41#41 CJNE A CJNE A,#10H#10H,L3 L3 L3L3:JNC L4JNC L4 MOV A MOV A,R1R1 ADD A ADD A,#08#08 MOV R0 MOV
19、 R0,A A SJMP L4 SJMP L4L2L2:MOV AMOV A,R1R1 CLR C CLR C SUBB A SUBB A,#0l#0l MOV R0 MOV R0,A AL4L4:MOV 5BHMOV 5BH,R0 R0 SJMP SJMP ENDEND三、散转程序设计n n散转程序的设计可采用下面两种方法:散转程序的设计可采用下面两种方法:n n(1)(1)数据指针数据指针DPTRDPTR固定,根据累加器固定,根据累加器A A的内容,的内容,程序转入相应的分支程序中去。程序转入相应的分支程序中去。n n(2)(2)累加器累加器A A清清“0”0”,根据数据指针,根据数据指针
20、DPTRDPTR的值,的值,决定程序转向目的地址。决定程序转向目的地址。DPTRDPTR的值可用查表或的值可用查表或其他方法获得。其他方法获得。1 1 采用转移指令表采用转移指令表 (最常用的方法)(最常用的方法)需要根据某标志单元的内容需要根据某标志单元的内容(输入或运算结果输入或运算结果)是是0 0,1 1,2 2,n n,分别转向操作程序分别转向操作程序0 0、操作程序、操作程序1 1、操作程序、操作程序2 2、操作程序、操作程序”。例2 P93 JUMP1:MOV DPRT,#JPTAB1JUMP1:MOV DPRT,#JPTAB1 MOV A,R7 MOV A,R7 ADD A,R7
21、ADD A,R7 ;配合双字节的配合双字节的AJMPAJMP指令表指令表 JNC NOADJNC NOAD ;为保证为保证256256分支,修正分支,修正DPTRDPTR INC DPH INC DPH NOAD:JMP A+DPTR NOAD:JMP A+DPTR JPTAB1:AJMP OPR0 JPTAB1:AJMP OPR0 AJMP OPR1 AJMP OPR1 AJMP OPR2 AJMP OPR2 AJMP AJMP OPRnOPRn2、采用地址偏移量表、采用地址偏移量表(一种变相应用方式)(一种变相应用方式)n n例例例例4 4 根据根据根据根据R7 R7 的内容转向的内容转向
22、的内容转向的内容转向5 5个操作程序个操作程序个操作程序个操作程序JUMP:JUMP:MOV A,R7MOV A,R7MOV DPTR,#TAB3MOV DPTR,#TAB3MOVC A,A+DPTRMOVC A,A+DPTRJMP A+DPTRJMP A+DPTRTAB3:TAB3:DB OPR0_TAB3DB OPR0_TAB3DB OPR1_TAB3DB OPR1_TAB3DB OPR2_TAB3DB OPR2_TAB3DB OPR3_TAB3DB OPR3_TAB3DB OPR4_TAB3DB OPR4_TAB3OPR0OPR0:程序段程序段程序段程序段00OPR1OPR1:程序段程序
23、段程序段程序段11OPR2OPR2:程序段程序段程序段程序段22OPR3OPR3:程序段程序段程序段程序段33OPR4OPR4:程序段程序段程序段程序段443、采用转向地址表、采用转向地址表n n例例5 5 根据根据R7R7的内容转入各对应的操作程序中去的内容转入各对应的操作程序中去 n nJUMP4:JUMP4:MOV DPTR,#TAB4MOV DPTR,#TAB4n nMOV A,R7MOV A,R7n nADD A,R7ADD A,R7n nJNC NADDJNC NADDn nINC DPHINC DPHn nNADD:NADD:MOV R3,AMOV R3,An nMOVC A,A
24、+DPTRMOVC A,A+DPTRn nXCH A,R3XCH A,R3n nINC AINC An nMOVC A,A+DPTRMOVC A,A+DPTRn nMOV DPL,AMOV DPL,An nMOV DPH,R3MOV DPH,R3n nCLR ACLR An nJMP A+DPTRJMP A+DPTRn nTAB4:TAB4:DW OPR0_ADDR ;DW OPR0_ADDR ;注意:高位先行问题注意:高位先行问题n nDW OPR1_ADDRDW OPR1_ADDRn nn nDW DW OPRn_ADDROPRn_ADDR4 4、用堆栈实现散转、用堆栈实现散转、用堆栈实现
25、散转、用堆栈实现散转(非正规的运用)(非正规的运用)(非正规的运用)(非正规的运用)n nJUMP4:JUMP4:MOV DPTR,#TAB4MOV DPTR,#TAB4n nMOV A,R7MOV A,R7n nADD A,R7ADD A,R7n nJNC NADDJNC NADDn nINC DPHINC DPHn nNADD:NADD:MOV R3,AMOV R3,An nMOVC A,A+DPTRMOVC A,A+DPTRn nXCH A,R3XCH A,R3n nINC AINC An nMOVC A,A+DPTRMOVC A,A+DPTRn nPUSH ACCPUSH ACCn n
26、 MOV A,R3 MOV A,R3n n PUSH ACC PUSH ACCn n RET RETn n TAB4:TAB4:DW OPR0_ADDR ;DW OPR0_ADDR ;注意:高位先行问题注意:高位先行问题n nDW OPR1_ADDRDW OPR1_ADDRn nn nDW DW OPRn_ADDROPRn_ADDR返回5-4 查表程序设计查表程序设计n nMOVC A,A+DPTRMOVC A,A+DPTRn nMOVC A,A+PCMOVC A,A+PCn n1 1、简单查表简单查表简单查表简单查表n n例例例例1 1 设计一个将十六进制数转变为设计一个将十六进制数转变为A
27、SCIIASCII码的子程序码的子程序n nTOASCII:MOV A,R0TOASCII:MOV A,R0n nANL A,#0FHANL A,#0FHn nADD A,#2ADD A,#2n nMOVC A,A+PCMOVC A,A+PCn nMOV R0,AMOV R0,An nRETRET DB 30H,31H,32H,33H,34H,DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H 35H,36H,37H,38H,39Hn nDB 41H,42H,43H,44H,45H,46HDB 41H,42H,43H,44H,45H,46H例例例例2 2按按2
28、0H20H中的值(中的值(0 09 9),实现通过堆栈的散转),实现通过堆栈的散转n nTO2BYTE:MOV DPTR,#TABTO2BYTE:MOV DPTR,#TABn nMOV A,20HMOV A,20Hn nCLR CCLR Cn nRLC ARLC An nMOV 20H,AMOV 20H,An nINC AINC An nMOVC A,A+DPTRMOVC A,A+DPTRn nPUSH ACCPUSH ACCn nMOV A,20HMOV A,20Hn nMOVC A,A+DPTRMOVC A,A+DPTRn nPUSH ACCPUSH ACCn nRETRETn n TAB
29、:TAB:DW 0123HDW 0123Hn nDW 0186HDW 0186Hn nDW 0234HDW 0234Hn nDW 0316HDW 0316Hn nDW 0415HDW 0415Hn nDW 0520HDW 0520Hn nDW 0626HDW 0626Hn nDW 0710HDW 0710Hn nDW 0818HDW 0818Hn nDW 0929HDW 0929H返回5-5 子程序设计子程序设计n n在实际应用中把多次用到的、完成一定程序功在实际应用中把多次用到的、完成一定程序功能的指令段(如多字节加法、延时等)独立写能的指令段(如多字节加法、延时等)独立写成子程序的形式,可
30、以达到简化程序结构的作成子程序的形式,可以达到简化程序结构的作用。用。n n一一一一 子程序结构与设计注意事项子程序结构与设计注意事项子程序结构与设计注意事项子程序结构与设计注意事项1 1、子程序名的定义,一般有一定的提示作用(是入、子程序名的定义,一般有一定的提示作用(是入口地址的代号)口地址的代号)2 2、子程序进、出时的参数传递、子程序进、出时的参数传递3 3、保护现场与恢复现场的问题、保护现场与恢复现场的问题4 4、移植性问题、移植性问题二二 子程序的调用与返回子程序的调用与返回n n1、调用过程:断点入栈;调用地址;n n2、返回过程:断点恢复n n3、一般情况下不能强行跳出子程序,
31、注意保护现场三三 子程序嵌套子程序嵌套1、全嵌套、全嵌套2、嵌套深度问题与堆栈区安全、嵌套深度问题与堆栈区安全四四四四 子程序设计子程序设计子程序设计子程序设计n n例例3 3在在50H50H单元存放着单元存放着2 2个个1616进制数字,编程使它们分进制数字,编程使它们分别转换成别转换成ASCIIASCII码,并存入码,并存入51H51H和和52H52H单元中。单元中。n n ORG 2000HORG 2000HMOV SP,#3FHMOV SP,#3FHPUSH 50HPUSH 50HACALL HASCACALL HASCPOP 51HPOP 51HMOV A,50HMOV A,50HS
32、WAPSWAPPUSH ACCPUSH ACCACALL HASCACALL HASCPOP 52HPOP 52HSJMP$SJMP$ORG 2100HORG 2100HHASC:DEC SPHASC:DEC SPDEC SPDEC SPPOP ACCPOP ACCANL A,#0FHANL A,#0FHADD A,#7ADD A,#7MOVC A,A+PCMOVC A,A+PCPUSH ACCPUSH ACCINC SPINC SPINC SPINC SPRETRETTAB:TAB:DB“0123456789”DB“0123456789”DB“ABCDEF”DB“ABCDEF”返回5-6 综合编程举例综合编程举例n请同学们自己先认真看懂本节的例题,然后用“伟福“仿真它们。返回