微机原理与接口技术第五章汇编语言程序设计第五章汇编语言程序设计概述5.1顺序与循环程序设计5.2分支程序及查表设计5.3子程序设计5.4综合编程举例5.5微机原理与接口技术第五章汇编语言程序设计5.1概述1、机器语言2、汇编语言3、高级语言5.1.1程序设计语言1.汇编语言源程序的格式标号:操作码操作数,操作数;注释在书写汇编语句时,上述各部分应该严格地用定界符加以分离。定界符包括空格符、冒号、分号、逗号等。5.1.2汇编语言的规范微机原理与接口技术第五章汇编语言程序设计5.1概述(1)、标号段:标号是用户设定的一个符号,表示存放指令或数据的存储单元地址。标号是由字母开始的1~8个字母或数字串组成。注:不能用指令助记符、伪指令或寄存器名来作标号名。(2)、操作码段:是指令或伪指令的助记符,用来表示指令的性质。(3)、操作数段:给出的是参加运算(或其他操作)的数据或数据的地址。(4)、注释段:为便于今后阅读和交流,对本指令执行的目的和所起作用所做的说明。微机原理与接口技术第五章汇编语言程序设计5.1概述(1)、ORG(origin)这是一条程序汇编起始地址定位伪指令,用来规定汇编语言程序进行汇编时,目的程序在程序存储器中存放的起始地址,它的格式如下:标号操作码操作数ORG表达式(exp)(2)、END汇编语言程序结束伪指令,用在程序的末尾,表示程序已结束。汇编程序对END以后的指令不再汇编。2.汇编语言伪指令微机原理与接口技术第五章汇编语言程序设计5.1概述(3)、EQU(EQUATE)赋值(也称等值)伪指令,它的作用是把操作数段中的地址或数据赋值给标号字段中的标号。它的格式如下:标号(字符名称)EQU数或汇编符号例1、AAEQUR1;R1与AA等值则“MOVA,AA”与“MOVA,Rl”等值。例2、K1EQU40DLEQU0FA4CHMOVA,K1;40→ALJMPDL;FA4CH→PC2.汇编语言伪指令微机原理与接口技术第五章汇编语言程序设计5.1概述(4)、DB(DefineByte)定义字节伪指令,它的功能是从指定单元开始定义(存储)若干个字节的数值或ASCll码字符。常用于定义数据常数表。它的格式如下:操作码操作数DB字节常数或ASCII字符例3、ORG1000HDB76H,73,‘C’,‘B’,;在表示ASCll字符时需要用‘’括号DB0ACH则(1000H)=76H(1001H)=49H(1002H)=43H(1003H)=42H(1004H)=0ACH2.汇编语言伪指令微机原理与接口技术第五章汇编语言程序设计5.1概述(5)、DW(DefineWord)定义字伪指令,它的功能是从指定单元开始定义(或存储)若干个字的数据或ASCll码字符。它的格式如下:操作码操作数DW字常数或ASCII字符例4、ORG2200HDW1246H,7BH,10则(2200H)=12H(2201H)=46H(2202H)=00(2203H)=7BH(2204H)=00(2205H)=0AH2.汇编语言伪指令微机原理与接口技术第五章汇编语言程序设计5.1概述(6)、BIT位地址符号伪指令,它的功能是把位地址赋予所规定的字符名称。它的格式如下:字符名称操作码操作数BIT位地址例5、ABCBITP1.0Q4BITP2.2则汇编后,位地址P1.0、P1.2分别赋给变量ABC和Q4。2.汇编语言伪指令微机原理与接口技术第五章汇编语言程序设计5.1概述(7)、DATA定义标号数值伪指令,它的功能是给标号段中的标号赋以数值。它的格式如下:标号操作码操作数字符名称DATA表达式例6、MNDATA3000H汇编后MN的值为3000H。DATA与EQU的区别在于:用DATA定义的标识符汇编时作为标号登记在符号表中,所以可以先使用后定义;而EQU定义的标识符必须先定义后使用,因后者不登记在符号表中。2.汇编语言伪指令微机原理与接口技术第五章汇编语言程序设计5.1概述(1)、熟悉和分析工作任务,明确任务要求、工作目的和技术指标等。(2)、确定解决问题的工作方法和工作步骤。(3)、画工作流程图。(4)、分配内存工作单元,确定程序与数据区存放地址。(5)、按流程图编写源程序。(6)、上机调试、修改及最后确定源程序。5.1.3汇编语言程序设计步骤微机原理与接口技术第五章汇编语言程序设计5.1概述汇编有两种方法:手工汇编、机器汇编。源程序(汇编语言程序)汇编程序(完成把源程序翻译成目的程序的工作)目的程序(机器语言程序)ORG2000H200090MOVDPTR,#TAB2003E520MOVA,20H200593MOVCA,@A+DPTR2006F521MOV21H,A200822RET2009000104TAB:DB00H,01H,04H,09H,10H,19H201209,10,19微机原理与接口技术第五章汇编语言程序设计5.2顺序与循环程序设计循环结构包括:循环初态、循环体、循环控制部分顺序结构微机原理与接口技术第五章汇编语言程序设计5.2顺序与循环程序设计例1、将20H单元的两个BCD码拆开并变成ASCll码,存入21H、22H单元。注意:ASCll码0~9为30H~39H。5.2.1顺序程序设计解:采用先把20H中低4位BCD码交换出来,加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。微机原理与接口技术第五章汇编语言程序设计源程序如下:地址机器码周期数源程序ORG0000H0000H0202003LJMPMAINORG0200H0200H78221MAIN:MOVR0,#22H0202H76001MOV@R0,#00204HE5201MOVA,20H0206HD61XCHDA,@R00207H4322302ORL22H,#30H020AHC41SWAPA020BH44301ORLA,#30H020DHF5211MOV21H,A020FH80FE2SJMP$END5.2顺序与循环程序设计微机原理与接口技术第五章汇编语言程序设计例3已知:89C51单片机使用的晶振为6MHz,要求设计一个软件延时程序,延时时间为10ms。5.2顺序与循环程序设计解:延时程序的延时时间主要与两个因素有关,一个是所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数。在本题中已知晶振为6MHz,则可知一个机器周期为2s,可预计采用单重循环是有可能实现1ms的延时的。现根据题意编写源程序如下:5.2.2循环程序设计微机原理与接口技术第五章汇编语言程序设计5.1周期数1MOVR0,#0AH;毫秒数R01DL2:MOVR1,#MT;1ms延时的预定值MTR11DL1:NOP1NOP2DJNZR1,DL1;1ms延时循环2DJNZR0,DL2;毫秒数减1,不等于0,继续循环,等于0结束。5.2顺序与循环程序设计5.2.2循环程序设计微机原理与接口技术第五章汇编语言程序设计5.2.2循环程序设计例1、从22H单元开始有一无符号数据块,其长度在20H单元。求数据块中的最大数。ORG30HCLRA;清A作为初始最大值MOVR0,20H;数据个数初值MOVR1,#22H;数据块首地址初值LP:CLRC;清进位SUBBA,@R1;最大值减队列中数JNCNEXT;小于最大值继续MOVA,@R1;大于最大值,则用此值代换SJMPNEXT1NEXT:ADDA,@R1;小于最大值,则恢复NEXT1:INCR1;修改地址指针DJNZR0,LP;依次重复比较,直至R2=0MOV21H,A;最大值存入21H单元RET微机原理与接口技术第五章汇编语言程序设计5.3分支程序设计5.3.1分支程序设计综述分支程序应用要点是正确使用转移指令,通常有如下3种指令。1.无条件转移2.条件转移3.散转5.3分支程序设计微机原理与接口技术第五章汇编语言程序设计5.3.2例3设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元。Y=3X,X10Y=2X+10,10=X=15Y=40,X15分支程序设计5.3.2无条件/条件转移程序微机原理与接口技术第五章汇编语言程序设计分支程序设计ORG200HMOVA,5AHADDA,5AH;2X→AMOVR1,AMOVA,5AH;重新把X装入ACJNEA,#10,L1L1:JCL2;X10转L2MOVR0,#40;先假设X15CJNEA,#10H,L3;与16比L3:JNCL4;X15转L4MOVA,R1ADDA,#10;10≤X≤15,Y=2X+10MOVR0,ASJMPL4L2:MOVA,R1ADDA,5AH;X10,Y=3XMOVR0,AL4:MOV5BH,R0;存结果SJMP$RET5.3.2微机原理与接口技术第五章汇编语言程序设计散转程序设计5.3.3例2根据R3的内容,转向各个操作程序。R3=0,转入OPR0R3=1,转入OPR1……….R3=n,转入OPRn解:程序清单如下。MOVDPTR,#TAB1;跳转表首地址送数据指针MOVA,R3;R3×2A(修正变址值)ADDA,R3JNCROAD;判有否进位INCDPH;有进位则加到高字节地址ROAD:JMP@A+DPTR;转向形成的散转地址入口TAB1:AJMPOPR0;转移到OPR0AJMPOPR1……..AJMPOPRn微机原理与接口技术第五章汇编语言程序设计查表程序设计5.4.1例1设计一个将16进制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。ORG30HMOVA,R0ANLA,#0FH;保留低4位ADDA,#2;变址调整MOVCA,@A+PC;查表获取ASCII码值MOVR0,ARETTAB:DB30H,31H,32H,33H,34H,35HDB36H,37H,38H,39H,41H,42H,43H,44H,45H,46H微机原理与接口技术第五章汇编语言程序设计5.5子程序设计子程序的结构与一般的程序并无多大区别,它的主要特点是,在执行过程中需要由其它程序来调用,执行完后又需要把执行流程返回到调用该子程序的主程序。子程序调用时要注意两点:1、现场的保护和恢复(保持栈平衡);2、主程序与子程序的参数传递:1)利用累加器或寄存器2)当传送的数据量比较大时,可以利用存储器实现参数的传递3)利用堆栈传递微机原理与接口技术第五章汇编语言程序设计5.5子程序设计例1用程序实现c=a2+b2。设a、b均小于10。a存在31H单元中,b存在32H单元,把c存入33H单元。解:因本题二次用到平方值,所以在程序中采用把求平方的程序段编为子程序的方法。依题意编写主程序和子程序如下:ORG200H20075813FMOVSP,#3FH;设堆栈指针203E531MOVA,31H;取a值205120400LCALLSQR;求a2208F9MOVR1,A;a2值暂存R1209E532MOVA,32H;取b值20B120400LCALLSQR;求b220E29ADDA,R1;求a2+b220FF533MOV33H,A;存入33H微机原理与接口技术第五章汇编语言程序设计5.5子程序设计;子程序地址机器码源程序ORG400H40004SQR:INCA40183MOVCA,@A+PC40122RET403014916TAB:DB0,1,4,9,16408253649DB25,36,4940B64,81DB64,81微机原理与接口技术第五章汇编语言程序设计5.6综合编程举例例1将R0所指出单元中的ASCII码转换成十六进制数,并把结果仍存于原单元中.解:对于小于、等于9的数,ASCII代码减去30H得一位十六进制数,对于大于9的ASCII代码减去37H,则恰好是“0AH~0FH”的结果。编程如下:HEX:MOVA,@R0;取操作数CLRCSUBBA,#30H;0~9的转换MOV@R0,A;暂存结果SUBBA,#0AH;结果是否大于9JCSB2;小于、等于9,则返回XCHA,@R0SUBBA,