《汇编语言程序设计wy》由会员分享,可在线阅读,更多相关《汇编语言程序设计wy(27页珍藏版)》请在金锄头文库上搜索。
1、3.43.4 汇编语言及汇编语言程序设计汇编语言及汇编语言程序设计 大家已经了解了单片机内部的结构,大家已经了解了单片机内部的结构,MCS-51MCS-51指令指令系统的寻址方式以及各类指令的格式、功能。系统的寻址方式以及各类指令的格式、功能。 下面我们讲述如何利用下面我们讲述如何利用MCS-51MCS-51的指令系统,来编的指令系统,来编写具有不同功能的应用程序。写具有不同功能的应用程序。2024/8/2313.4.1 3.4.1 机器语言、汇编语言和高级语言机器语言、汇编语言和高级语言 程序设计语言一般分为程序设计语言一般分为3 3种:机器语言、汇编语言和种:机器语言、汇编语言和高级语言。
2、高级语言。1 1、 机器语言机器语言 是唯一能直接被是唯一能直接被CPUCPU识别和执行的二进制代码语言。识别和执行的二进制代码语言。用机器语言编写的程序,称为目标程序;通常无论用用机器语言编写的程序,称为目标程序;通常无论用何种语言编写的计算机程序,均需通过编译将它翻译何种语言编写的计算机程序,均需通过编译将它翻译成机器语言程序才能被成机器语言程序才能被CPUCPU识别、运行。识别、运行。 但机器指令的二进制代码很难记忆、辨识,给程但机器指令的二进制代码很难记忆、辨识,给程序的编写、阅读和修改带来很大的困难,因此一般不序的编写、阅读和修改带来很大的困难,因此一般不采用机器语言编写程序。采用机
3、器语言编写程序。2024/8/2322、 汇编语言汇编语言 为了容易理解和记忆计算机指令,人们用一些英文单词及为了容易理解和记忆计算机指令,人们用一些英文单词及数字作为助记符来描述每一条指令的功能。用助记符描述的指数字作为助记符来描述每一条指令的功能。用助记符描述的指令系统,被称为机器的汇编语言系统,简称汇编语言。令系统,被称为机器的汇编语言系统,简称汇编语言。 用汇编语言的每条指令意义清晰,编写、阅读和修改都很用汇编语言的每条指令意义清晰,编写、阅读和修改都很。汇编指令和机器语言指令是一一对应的,即一条可执行的汇。汇编指令和机器语言指令是一一对应的,即一条可执行的汇编指令对应着一条机器语言指
4、令,因此汇编语言可直接利用和编指令对应着一条机器语言指令,因此汇编语言可直接利用和发挥机器硬件系统的许多特性,如:寄存器,标志位及一些特发挥机器硬件系统的许多特性,如:寄存器,标志位及一些特殊指令等,能提高编程的质量和运行速度,且占用内存少。殊指令等,能提高编程的质量和运行速度,且占用内存少。一般如:系统软件、实时控制系统、智能化仪器、仪表软件等一般如:系统软件、实时控制系统、智能化仪器、仪表软件等对时间和存储容量要求较高的程序常用汇编语言书写。对时间和存储容量要求较高的程序常用汇编语言书写。2024/8/2333、高级语言 高级语言是一种面向问题或过程的语言。它是一种接近于自然语言和数学算法
5、的语言,与机器硬件无关,用户不必了解所有计算机的硬件和指令系统。高级语言不但直观、易学且通用性强可移植性好。 高级语言编写的程序需要由编译程序或解释程序翻译成对应的目标程序,机器方可接受。但由于高级语言与机器语言不是一一对应的,往往一条高级语言指令对应着多条机器语言指令,因此翻译的时间长、目标程序长、占用空间大、执行速度慢。 2024/8/2343.4.2 3.4.2 汇编程序与伪指令汇编程序与伪指令1、汇编程序 汇编源程序必须“翻译”成目标程序,方可被CPU识别、执行,这个翻译的过程称为汇编。汇编工作一般由计算机的系统软件汇编程序来完成的。 汇编程序除了可将汇编源程序翻译成目标程序,还可根据
6、程序要求安排目标程序的存放地址、分配存储空间、语法检查,若有错误给出错误信息等。 2024/8/2352 2、伪指令、伪指令 在汇编源程序的过程中,有一些指令只是帮助汇编在汇编源程序的过程中,有一些指令只是帮助汇编源程序的,它们是源程序的,它们是控制汇编用的特殊指令,不属于指控制汇编用的特殊指令,不属于指令系统,令系统,不要求计算机做任何操作,不产生对应的机不要求计算机做任何操作,不产生对应的机器码,不影响程序的执行,这种指令被称为伪指令。器码,不影响程序的执行,这种指令被称为伪指令。 伪指令主要用来指定程序或数据的起始位置,给出伪指令主要用来指定程序或数据的起始位置,给出一些连续存放数据确定
7、地址,或为中间运算结果保留一些连续存放数据确定地址,或为中间运算结果保留一部分存储空间及表示源程序结束等。一部分存储空间及表示源程序结束等。 下面介绍几种常用的基本伪指令:下面介绍几种常用的基本伪指令: 2024/8/236 1 1) ORGORG伪指令伪指令 (Origin)(Origin) 通常用于源程序的开始处,用来规定目标程序的通常用于源程序的开始处,用来规定目标程序的 起始地址起始地址 格式:格式:ORG addr16 ;ORG addr16 ;addr16addr16是是1616位绝对地址位绝对地址, , 可用标号或表达式表示。可用标号或表达式表示。如:如:ORG 1000H OR
8、G 1000H ;将程序的起始地址定为;将程序的起始地址定为1000H1000H 2) ENDEND伪指令伪指令 ENDEND语句放在源程序结束的地方,用来告诉汇编程语句放在源程序结束的地方,用来告诉汇编程序源程序到此结束,对后面的指令都不用汇编。序源程序到此结束,对后面的指令都不用汇编。 格式:格式: ENDEND 注:注:ENDEND语句不得有标号语句不得有标号2024/8/2373 3) EQUEQU伪指令伪指令 ( (EQUEQUateate) ) 赋值伪指令,把一个表达式或特殊的汇编符号赋予赋值伪指令,把一个表达式或特殊的汇编符号赋予规定的名称。规定的名称。 格式:格式: 符号名称符
9、号名称 EQU EQU 表达式表达式/ /特殊汇编符号特殊汇编符号 例:例: SGSGEQUEQUR0 ; SGR0 ; SG与与R0R0等价等价DEDEEQUEQU40H 40H ; DEDE与与40H40H等值等值MOV AMOV A,SGSG; ( (R0R0)AAMOV R7MOV R7,#DE #DE ; #40H R7 #40H R7 MOV SG, R7 ; #40H MOV SG, R7 ; #40H R0R0 注:汇编后,注:汇编后,EQUEQU左边的符号名称就等同于其右边的左边的符号名称就等同于其右边的表达式或汇编符号,这样符号名称就可以作为立即数表达式或汇编符号,这样符号
10、名称就可以作为立即数或地址来使用。且在整个程序中不能再改变。或地址来使用。且在整个程序中不能再改变。2024/8/2384) SET伪指令 类似于EQU,也是用一个表达式的值命名一个符号,区别在于以后可用另一个SET伪指令对定义过的符号重新定义。 格式: 符号名称 SET 表达式 如: VALU SET 1 ; VALU=1 REG1 SET R1; 把R1赋给REG1 VALU SET VALU+1;重新定义VALU 2024/8/2395) BIT伪指令 把一个位地址赋予规定的符号名称,定义后不得重新定义。 格式: 符号地址 BIT 位地址 如: FLAG BIT F0 AI BIT P1
11、.06)DATA伪指令 把片内的数据地址赋予所规定的符号。片内的数据地址指的是内存00H7FH或位于80HFFH的特殊功能寄存器,定义好的符号不得重新定义。 格式: 符号地址 DATA 数据地址 如: RES DATA 30H;定义符号RES为内存地址30H PORT0 DATA 80H;定义符号PORT0为SFR中P02024/8/23107 7) DBDB伪指令(伪指令(Define ByteDefine Byte) 从指定单元开始定义(存储)若干个字节的数据从指定单元开始定义(存储)若干个字节的数据或或ASCIIASCII码字符,常用于定义数据常数表。码字符,常用于定义数据常数表。格式:
12、格式: 【标号:标号:】 DB DB 表达式列表表达式列表 如如: : PRE:DBPRE:DB34H34H,0DEH0DEH,A A,B B RES:DB RES:DBpress any key to continuepress any key to continue 注:注:ROMROM中,表达式列表中的每个字节依次存放在中,表达式列表中的每个字节依次存放在从标号地址开始的各个单元中。列表中的各项是一列从标号地址开始的各个单元中。列表中的各项是一列由逗号分开的一个或多个字节值或串。由逗号分开的一个或多个字节值或串。2024/8/23118 8)DWDW伪指令(伪指令(Define Word
13、Define Word) 从指定单元开始定义(存储)若干个字的数据或从指定单元开始定义(存储)若干个字的数据或ASCIIASCII码字符。码字符。 格式:格式:【标号:标号:】DW DW 字常数或字常数或ASCIIASCII字符字符 如:如: DWDW1234H1234H,B BDWDW 0AH 0AH,20209 9)DSDS伪指令伪指令 以字节为单位保留空间。以字节为单位保留空间。DSDS语句从当前地址开始保语句从当前地址开始保留空间,空间的大小由表达式的值来确定。留空间,空间的大小由表达式的值来确定。 格式:格式: 【标号:标号:】 DS DS 表达式表达式 如:如:SUM: DS 20
14、 SUM: DS 20 ;从标号;从标号SUMSUM代表的地址开始,代表的地址开始, 保留连续的保留连续的2020个字节单元。个字节单元。 2024/8/23123.5 3.5 基本程序设计方法基本程序设计方法 3.5.1 3.5.1 程序的基本结构程序的基本结构1 1、分析问题(包括硬件、软件系统分析),抽象出、分析问题(包括硬件、软件系统分析),抽象出 描述的数学模型;描述的数学模型;2 2、确定解决问题的算法和工作步骤;、确定解决问题的算法和工作步骤;3 3、根据算法绘制程序流程图;、根据算法绘制程序流程图;4 4、分配存储空间,确定程序与数据区存放地址;、分配存储空间,确定程序与数据区
15、存放地址;5 5、编写源程序;、编写源程序;6 6、静态检查;、静态检查;7 7、上机调试、修改,最终确定程序。、上机调试、修改,最终确定程序。2024/8/2313n 有关流程图中符号表示:开始、结束圆角矩形工作任务矩形判断分支菱形程序流向箭头程序连接开始结束n 程序的基本算法结构有3种: 顺序结构 分支结构(选择) 循环结构2024/8/2314 3.5.2 顺序结构程序设计 顺序结构是最简单的一种基本结构。若一个待解决的问题可分解成若干个简单的操作步骤,并可由这些操作按照一定的顺序构成解决问题的算法,则可用简单的顺序结构来进行程序设计。 顺序结构图ab A B2024/8/2315开始将
16、待转换的数据送入A A除以100将A中得到的百位数取出另存结束A中十位及B中个位取出另存余数除10Org 0000hLjmp Main org 0100hMain :mov A ,R1 mov B ,#100 div AB mov 30H,A mov A ,B mov B ,#10 div AB mov 31H ,A mov 32H ,B sjmp $例3.27:编制单字节BCD码转换程序2024/8/2316 3.5.3 3.5.3 分支(选择)结构程序设计 在实际程序设计时,有很多情况需要程序按照给定条件进行分支。分支程序可根据要求判断某一变量当前所处之状态,根据判断结果来改变程序执行流向
17、。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)。 在编写分支程序时,51指令系统提供了丰富的控制转移指令,如:JZ(JNZ)、CJNE、JC(JNC)及JB(JNB)等。2024/8/2317K=?程序段nn0程序段1多分支结构程序段01条件成立?程序段BYN程序段A双分支结构条件成立?下条指令程序段A单分支结构YN2024/8/2318例3.28:假设NUM单元中存放的是经过处理的数据,若数值在099之间,则下图中P1.1口所接的LED灯亮;若数值在100180之间,则无动作(灯灭);若在181255之间,则P1.0口所接之灯亮。P1.0P1.
18、1P1.2VCC2024/8/2319NUM100NUM100?y=x+50y=20Hy=x0开始存y 即y 30h结束例3.28流程图2024/8/2320 ORG 1000HSTART:MOV A,30H JZ NEXT ;x=0,转移 ANL A,#80H ;保留符号位 JZ ED ;x0,转移 MOV A,#05H ;x0,不转移 ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,#20H ED:SJMP $2024/8/2321 3.5.4 循环结构程序设计 编写程序时,当需要将同一组操作重复多次时,应采用循环结构,以简化程序,缩短长度和存储空间。循环
19、程序一般由3部分构成: 置循环初值; 循环体:重复执行部分; 循环控制部分:参数修改和依据结束条件判定循环 是否结束。 循环程序的结构一般有两种:until直到型:先执行循环体一次,再判断条件,条 件不成立则跳出循环;while当型:先判断条件,条件成立再执行循环体;2024/8/2322设置循环初值循环处理循环修改循环结束?NY(a)直到型循环设置循环初值循环处理循环修改循环结束?YN(b)当型循环2024/8/2323例3-29 : 50ms延时子程序。设晶振频率为12MHz,则机器周期为1us。DEL: MOV R7,#200 ;1MCDEL1:MOV R6,#123 ;1MC NOP
20、;1MC DJNZ R6,$ ;2MC DJNZ R7,DEL1 ;2MC RET ;2MC延时时间:t=1+200(1+1+2*123)+2+2 50000us=50ms2024/8/2324 3.5.5 3.5.5 子程序结构设计子程序结构设计 将反复出现的程序段编成一个独立的程序段存放在内存中,它能够完成某一特定任务,可被重复调用称为子程序。恰当的使用子程序可使整个程序结构清楚、可读性强,且减少源程序和目标程序的长度,提高了编程效率。 高级语言调用子程序,传递参数很方便;但汇编程序在调用子程序时传参是个问题。因为其调用指令并不附带任何参数,那么参数的传递是需要靠编程者自己设计:如何安排数
21、据的存放及工作单元的选择。汇编语言中参数的传递方法有3种:寄存器传参、指针传参以及堆栈传参。 2024/8/2325 1) 用累加器或工作寄存器来传参; 在调用子程序之前把数据送入寄存器R0R7或累加器。调用返回后运算结果仍由它们送回。 2) 用指针寄存器传递参数 因一般数据都存放于存储器中,所以可用指针来指示数据位置。若数据存在内存RAM中,则通常用R0或R1做指针寄存器;若参数放在外部RAM或程序存储器中,则可用DPTR做指针。 3) 用堆栈传参 调用子程序之前,可先将参数压入堆栈中保存,进入子程序后,再将压入堆栈的参数弹出给指定的工作寄存器或其他内存单元。但该种方式使用时要清楚堆栈的操作。2024/8/23261. 给子程序赋一个名字。实际为入口地址代号。给子程序赋一个名字。实际为入口地址代号。2. 要能正确传递参数:要能正确传递参数: 入口条件:子程序中要处理的数据如何给予。入口条件:子程序中要处理的数据如何给予。 出口条件:子程序处理结果如何存放。出口条件:子程序处理结果如何存放。 (寄存器、存储器、堆栈方式)(寄存器、存储器、堆栈方式)3. 保护与恢复现场:保护与恢复现场: 保护现场:压栈指令保护现场:压栈指令PUSH 恢复现场:弹出指令恢复现场:弹出指令POP4. 子程序可以嵌套子程序可以嵌套2024/8/2327