1、第章汇编语言程序设计,本章内容,概述,分支程序,循环程序,简单程序,查表程序,子程序,应用举例,程序设计概述设计语言,最早人们只能用机器语言(二进制)编写程序;为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编;为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如: BASIC、FORTRAN、PASCAL、 C、JAVA 然后再用编译系统将其翻译成机器语言,该过程称为编译;机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编语言编写的源程序汇编成机器语言;由低级或高级语言构
2、成的程序称为源程序,由机器语言构成的程序称作目标程序;,源程序 目标程序,低级语言,机器语言,汇编,高级语言,机器语言,编译,程序设计实例引入,实例假设一个班有50个人,共有3门选修课:计算机算法服装CAD设计德语请找出:同时选了三门课的同学;,问题的解决,第一步 如何在计算机中表示选修某门课的所有同学,选修这门人数,学生的学号,这个过程实际上是设计数据结构的问题,问题的解决,第二步 设计思路:找出同时选了三门课的同学,这个过程实际上是设计算法的过程,既构建模型。,重复该过程,第三步:设计流程,几点启示,整体构思;构建整体流程框图;结构合理,流程清晰,简单明了;局部模块化;,为什么要用流程图?
3、,符合人进行逻辑思考的习惯计算机从根本上来说,没有任何逻辑性,所以,你必须告诉它,先做什么,后做什么,遇到什么情况又该做什么,等等流程图设计本身是一个逐步求精的过程,最终将任务划分为若干能由机器指令实现的小模块,顺序程序设计,例 1 两个无符号双字节数相加。 设被加数存放于内部RAM的40H(高位字节), 41H(低位字节), 加数存放于50H(高位字节), 51H(低位字节), 和数存入 40H和41H单元中。,程序如下: START: CLR C ; 将Cy清零 MOV R0, 41H ; 将被加数地址送数据指针R0 MOV R1, 51H ; 将加数地址送数据指针R1 AD1: MOV
4、A, R0 ; 被加数低字节的内容送入AADD A,R1 ; 两个低字节相加MOV R0, A ; 低字节的和存入被加数低字节中 DEC R0 ; 指向被加数高位字节 DEC R1 ; 指向加数高位字节 MOV A, R0 ; 被加数高位字节送入AADDC A, R1 ; 两个高位字节带Cy相加 MOV R0, A ; 高位字节的和送被加数高位字节 RET,例 2 将两个半字节数合并成一个一字节数。 设内部RAM 40H#, 41H单元中分别存放着 8 位二进制数, 要求取出两个单元中的低半字节, 并成一个字节后, 存入 50H单元中。 程序如下:,START: MOV R1, 40H ; 设
5、置R1为数据指针MOV A, R1 ; 取出第一个单元中的内容ANL A, 0FH ; 取第一个数的低半字节SWAP A ; 移至高半字节INC R1 ; 修改数据指针XCH A, R1 ; 取第二个单元中的内容ANL A, 0FH ; 取第二个数的低半字节ORL A, R1 ; 拼字MOV 50H, A ; 存放结果RET,1. 分支程序设计,结构特点:不一定按指令的先后顺序依次运行程序,程序的流向有两个或两个以上分支,根据指定条件选择程序的流向。,2. 分支程序的典型实例,实例:已知30H单元中有一变量X,要求编写一程序按下述要求给Y赋值,结果存入31H单元。 X+1, X0 Y = 0
6、, X = 0 1 , X0题意:根据X的不同,程序编写时有三个出口,即有三个分支!,想一想:程序怎么编写?,分支程序实例-三分支程序,开始,XA,A= 1,A= A+1,存结果,结束,Y,Y,N,N,程序框图:,A0?,A=0?,分支程序实例-三分支程序,源程序如下: ORG 2000H MOV A,30H JZ LP1 ;X = 0,转LP1处理 JNB ACC.7,LP2 ;X0,转LP2处理 MOV A,#0FFH ;X0,则Y= 1 SJMP LP1 LP2:ADD A,#01 ;X 0,Y=X+1 LP1:MOV 31H,A ;存结果 SJMP $ ;循环等待,$表示转至 本地址,
7、此方法适用 于一字节的偏移量,最高位为符号位。,例4.3 设内部RAM20H单元和30H 单元中分别存放了两个8位的无符号数 X、Y, 若XY 则让P1.0管脚连接的LED亮;若XY 则让P1.1管脚连接的LED亮。,方法1:两个数据做减法SUBB,可根据借位CY来判断两个数的大小!,方法2:两个数据做比较CJNE,再根据是否相等和借位CY来判断两个数的大小!,分支程序实例-数据比较大小,方法1编程:,X DATE 20H Y DATE 30H ORG 0000H MOV A,X CLR C SUBB A,Y JC L1 CLR P1.0 SJMP FINISHL1: CLR P1.1FINI
8、SH: SJMP $ END,X DATE 20H Y DATE 30H ORG 0000H MOV A,X CJNE A,Y,L0 L0:JC L1 CLR P1.0 SJMP FINISHL1: CLR P1.1FINISH: SJMP $ END,方法2编程:,分支程序实例-数据比较大小,*例4.4 两个有符号数的比较。,问题1:如何表示有符号数呢?,问题2:有符号数怎样比较大小?,1.先判断符号位,负数小;正数大.2.符号相同,则用减法判断是否有借位.,比较20H和30H单元两个有符号数的大小,结果按下述规律显示在实训板上。(20H)=(30H),P1.0点亮; (20H)(30H),
9、P1.1点亮; (20H)(30H),P1.2点亮;,例4.4 程序框图,例4.4 程序清单,X DATA 20H Y DATA 30H;伪指令 ORG 0000H MOV A,X XRL A,Y ;X,Y进行异或 JB ACC.7,NEXT1 ;二者符号不同,跳转到NEXT1 MOV A,X ;符号相同 CJNE A,Y,NEQUAL;X Y,跳转到NEQUAL CLR P1.0 ;X=Y,点亮P1.0 SJMP FINISHNEQUAL: JC XXY ;X Y,转移到XDYNEXT1: MOV A,X JNB ACC.7,XDY ;判断X的正、负,正则转移到XDYXXY: CLR P1.
10、2 ;X Y,点亮P1.1FINISH: SJMP $ END,3. 散转程序设计,散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多用于键盘程序。常用的指令是JMP A+DPTR,该指令是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,形成散转的目的地址。,DPTR,+,A,PC,A中内容为8位无符号数,16位地址数,程序清单如下:JUMP1: MOV DPTR,JPTAB1 ;跳转表首送数据指针 MOV A,R7 ADD A,R7 ;R72A (修正变址值) JNC NOAD ;判有否进位 INC DPH ;有进位则加到高字节地址 NO
11、AD: JMP A+DPTR ;转向形成的散转地址人口JPTAB1: AJMP OPR0 ;直接转移地址表 AJMP OPR1 . AJMP OPRn,例: 根据R7的内容,转向各自对应的操作程序 (R7= 0,转入OPR0;R7= 1,转入OPR1R7= n,转入OPRn),4. 循环程序设计,结构特点:利用转移指令反复运行需要多次重复的程序段。循环程序的组成: 1. 初始化部分(设定循环次数等)。 2. 循环体(重复执行的部分,用于完成实际操作) 3. 循环控制(不断修改和判别循环变量,直至结束)。 4. 循环结束处理。,循环程序设计,延时程序中延时时间的设定:,源程序: 指令周期DELA
12、Y: MOV R3, #( X )H 2个T机器 DEL2: MOV R4,#( Y )H 2个T机器 DEL1: NOP 1个T机器 NOP 1个T机器 DJNZ R4,DEL1 2 个T机器 DJNZ R3,DEL2 2个T机器 RET,指令周期、机器周期T机器与时钟周期T时钟的关系: T机器=12T时钟=121/fosc=1s (假设晶振频率fosc为12M),延时时间的简化计算结果: (1+1+2) X Y,延时时间怎样计算?,若想延时100ms,只需修改计数初始值,即 (1+1+2) 125200s=100ms,循环程序设计,1S延时程序,源程序:DELAY: MOV R2, #10
13、 DEL3: MOV R3, #200DEL2: MOV R4,#125DEL1: NOP NOP DJNZ R4,DEL1 DJNZ R3,DEL2 DJNZ R2, DEL3 RET,1. 有如下程序段 : MOV R0,#30H SETB C CLR A ADDC A,#00H MOV R0,A 执行结果是( )。 A. (30H)=00HB. (30H)=01HC. (00H)=00HD. (00H)=01H,2. 汇编语言表示的指令格式中,标号与操作码之间用( )分开。 A. 冒号B. 分号C. 逗号 D. 井号3. 8051汇编指令格式中,地址和数据的区别符号为( )。 A. 冒号
14、B. 分号C. 逗号D. 井号,4. 散转指令是单片机指令系统中专为散转操作提供的无条件转移指令,指令格式如下: A. JMP A+DPTRB. LJMP 标号C. AJMP 标号D. SJMP 标号,5. MCS-51系列单片机存储器结构的特点之一是存在着四种物理存储空间,即片内RAM、片外RAM、片内ROM和片外ROM,不同的物理存储空间之间的数据传送一般以( )作为数据传输的中心。 A. 累加器AB. PSWC. PCD. RAM,6.分析下面程序段,累加器 A 中的内容为() 。 ORG 0000H MOV 30H,#45H MOV R0,#30H MOV A,#30H XCHD A,
15、R0 SJMP $ END A. 45H B. 35H C. 30HD. 34H,7.分析下面程序段,累加器 A 中的内容为() ORG 0000H MOV 30H,#45H MOV R0,#30H MOV A,R0 ANL A,#0F0H SWAP A ORL A,#30H SJMP $ END A. 45HB. 35HC. 30HD. 34H,8. 分析下面程序的功能。 X DATA 30H Y DATA 32H MOV A,X JNB ACC.7,DAYU CPL A ADD A,#01H DAYU: MOV Y,A SJMP $ END A. 比较X与Y大小B. 求绝对值C. X与Y相
16、加D. X与Y相乘,循环程序设计,例4.6:编程实现P1口连接的8个LED显示方式如下:从P1.0到P1.7的顺序,依次点亮其连接的LED。,ORG 0000HSTART: MOV R2,#08H ;设置循环次数 MOV A,#0FEH ;送显示模式字NEXT: MOV P1,A ;点亮二极管 ACALL DELAY RL A ;左移一位,改变显示模式字 DJNZ R2,NEXT ;循环次数减1,不为零,继续点亮 SJMP START ;下面一个二极管 DELAY: MOV R3,#0FFH ;延时子程序开始DEL2: MOV R4,#0FFHDEL1: NOP DJNZ R4,DEL1 DJ
17、NZ R3,DEL2 RET END,查表程序,表格是事先存放在ROM中的,一般为一串有序的常数,例如平方表、字型码表等。表格可通过伪指令DB来确定。通过查表指令MOVC A,A+DPTR MOVC A,A+PC来实现。,在LED显示和键盘处理程序中将会用到。,P152 MOVDPTR, #BSRLAMOVR2, AMOVCA, A+DPTRPUSHAINCAMOVCA,A+DPTRMOVDPH, APOPDPLCLRAJMPA+DPTRDBRK0LDBRKOHDBRK1LDBRK1H ,BS:,子程序设计,在实际问题中,常常会遇到在一个程序中多次用到相同的运算或操作,若每遇到这些运算或操作,
18、都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。,主要内容: 1. 主程序与子程序的关系 2. 子程序嵌套 3. 子程序的调用与返回,主程序与子程序的关系,主程序MAIN,返回,LCALL SUB,调用子程序,子程序入口地址,RET,子程序嵌套,子程序嵌套是指在子程序执行过程中,还可以调用另一个子程序。,子程序SUB1,主程序MAIN,LCALL SUB1,RET,子程序SUB2,RET,LCALL SUB2,子程序的调用与返回,问题:子程序调用、返回到主程
19、序中的正确位置,并接着执行主程序中的后续指令呢? 为了解决这个问题,我们采用了堆栈技术。,子程序SUB1,主程序MAIN,RET,子程序SUB2,RET,2010,2013,2110,2113,2100,2200,20 13,20,13,PC,21 13,13,21,堆栈指针SP,堆栈,LCALL SUB1,LCALL SUB2,子程序设计注意事项,(1)要给每个子程序起一个名字,也就是入口地址的代号。 (2)要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据放在何处(如:是放在A中还是放在某个工作寄存器中等)。另外,要有出口条件,即处理的结果存放在何处。 (3)注意保
20、护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现场。,程序名 :查找最大值功能 :查找内部RAM中无符号数据块的最大值入口参数:R1指向数据块的首地址,数据块长度存放在工作 寄存器R2中出口参数:最大值存放在累加器A中占用资源:R1,R2,A,PSWMAX:PUSH PSWCLR A;清A作为初始最大值LP: CLR C;清进位位SUBB A,R1;最大值减去数据块中的数JNCNEXT;小于最大值,继续MOVA,R1 ;大于最大值,则用
21、此值作为最大值SJMPNEXT1NEXT:ADDA,R1;恢复原最大值NEXT1: INCR1;修改地址指针DJNZR2,LPPOP PSWRET,1. MCS-51单片机的PSEN引脚是_选通信号,外部程序存储器,2. 寻址方式: 说明下列指令中源操作数采用的寻址方式。MOV R5,R7MOV A,55H MOV A,55H JMP A+DPTR MOV A,R0 MOVX A,R0,寄存器寻址方式直接寻址方式立即寻址方式变址寻址方式间接寻址方式间接寻址方式,编程3. 请将片外RAM20H-25单元清零,MOV R0,#20HMOV R7,#06HCLR ALOOP:MOVX R0,AINC
22、 R0DJNZ R7, LOOP,4.请将ROM 3000H单元内容送R7,MOV DPTR,#3000HCLR AMOVC A,A+DPTRMOV R7 ,A,5. 已知(31H)21H,(32H)04,H执行下列指令组后(31H)_(32H)_PUSH31HPUSH32HPOP31HPOP32H,6在3500H为首址的片外RAM区中,有20个补码表示的数,欲编程序,把其中正数传到20H为首址的片内RAM区中,负数不传送,请补全下列程序。MOVDPTR,3500HMOVR2,14HMOVR0,20H,LOOP:MOVXA,DPTR JBACC.7,COMMOV R0,A INC R0COM:
23、INCDPTRDJNZR2,LOOPHERE:SJMPHERE,伪 指 令 伪指令是对汇编过程 起控制作用,但本身并没有对应的机器代码的指令。,一、 汇编起始指令 ORG 指令格式为: ORG nn 该指令的作用是指明后面的程序或数据块的起始地址, 它总是出现在每段源程序或数据块的开始。 式中, nn为 16 位地址, 汇编时nn确定了此语句后面第一条指令或第一个数据的地址,此后的源程序或数据块就依次连续存放在以后的地址内, 直到遇到另一个ORG指令为止。,例: ORG 2000H MOV R0, 2FH MOV R2, 0FFH ORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是
24、2000H, 即 存储器地址 目标程序 2000H 78 2F 2002H 7A FF,二、等值指令EQU 指令格式: 字符名称 EQU 数字或汇编符号 例: PA8155 EQU 8001H ;即给标号PA8155赋值为8001H。 功能: 使指令中的字符名称等价于给定的数字或汇编符号。 使用等值指令可给程序的编制、调试、修改带来方便, 如果在程序中要多次使用到某一地址,由EQU指令将其赋值给一个字符名称, 一旦需要对其进行变动, 只要改变EQU命令后面的数字即可, 而不需要对程序中涉及到该地址的所有指令逐句进行修改。 但要注意, 由 EQU等值的字符名称必须先赋值后使用, 且在同一个源程序
25、中, 同一个标号只能赋值一次。,三、 定义字节指令DB 指令格式: 标号: DB 8位二进制数表 功能: 把 8 位二进制数表依次存入从标号开始的连续的存储单元中。 格式中, 标号区段可有可无, DB指令之后的 8 位二进制数表是字节常数或用逗号隔开的字节串, 也可以是用引号括起来的ASCII码字符串 (一个 ASCII字符相当于一个字节)。 例: ,ORG 1000HBUF1: DB 38H, 7FH, 80HBUF2: DB 45H, 66H ORG伪指令指定了标号BUF1的地址为1000H, 而DB伪指令是将其后的二进制数表38H, 7FH, 80H依次存放在1000H, 1001H,
26、1002H 3 个连续单元之中, BUF2也是一个标号, 其地址与前一条伪指令连续, 即1003H, 1004H地址单元中依次存放 45H, 66H。,四、 定义字指令DW 指令格式: 标号: DW 16 位数据表 该指令的功能与DB相似, 区别仅在于从指定地址开始存放的是指令中的 16 位数据, 而不是字节串。每个 16 位数据要占两个存储单元, 高8 位先存, 低 8 位后存, 这和MCS -51指令中的16位数据存放顺序是一致的。,五、 汇编结束指令END 指令格式: 标号: END 地址或标号 格式中标号以及END后面的地址或标号可有可无。 功能: 提供汇编结束标志。汇编程序遇到 EN
27、D后就停止汇编, 对 END以后的语句不予处理, 故 END应放在程序的结束处。,子程序的返回和中断响应过程中的中断返回都是通过改变 PC的内容实现的,而PC内容的改变是( )完成的。A通过POP命令 B通过MOV 指令 C通过RET或RETI指令 D自动,2.在MCS-51单片机中,当有压入或弹出堆栈操作时,SP的内容将随之增大或减小;程序计数器PC的内容将始终指示下一条将要执行指令的地址,所以只要改变PC的内容将改变程序的运行路径。SP的内容与PC的内容( )。 A都是8位地址 B都是16位地址 C位数相同 D位数不同,3. 单片机复位后,累加器A、PC、PSW的内容为( )AA = FF
28、H PC = 00H PSW = FFHBA = 00H PC = 0000H PSW = 00HCA = 07H PC = 0000H PSW = FFHDA = 00H PC = 00H PSW = 00H,4堆栈指针SP的作用是( )。 A 指示堆栈的栈底 B 指示堆栈的栈顶 C 指示下一条将要执行指令的地址 D 指示中断返回的地址,5下列指令中,不影响堆栈指针的指令是()。A RET B JB bit,relC LCALL addr16 D RETI,6使用单片机开发系统调试程序时,对原程序进行汇编的目的是( )。 A 将源程序转换成目标程序 B 将目标程序转换成源程序C 将低级语言转
29、换成高级语言 D 连续执行键,7. 定时/计数器的定时是指 ,定时/计数器的计数是指 。A对时间计数 B外部事件定时 C内部事件计数 D外部事件计数 E对内部时钟计数,8CPU允许接受相应中断,当INTO申请中断时,程序计数器PC的内容被自动修改为( )地址;当有定时器T1申请中断时,程序计数器 PC的内容被自动修改为( )地址。A、0003H B、000BH C、0013H D、001BH E、0023H,程序存储器ROM,0000H:复位后,程序的入口地址(PC=0000H),0023H:串行口中断入口,0003H:外部中断0入口,000BH:定时器0溢出中断入口,0013H:外部中断1入
30、口,001BH:定时器1溢出中断入口,002AH,9.在程序运行过程中执行PC=0200H的一条指令LCALL addr16,该调用子程序的返回指令是( ),实施该调用指令时,压入堆栈保存的程序地址是( )。A、 RETI B、RET C、ENDD、2000H E、0102H F、0203H,10当MCS-51单片机接有外部存储器,P2口可作为( )。 A数据输入口 B。数据的输出口 C准双向输入输出口 D输出高8位地址,11. 设内部RAM(30H)=5AH,(5AH)=40H,(40H)=00H,端口P1=7FH,问执行下列指令后,各有关存储单元(即R0,R1,A,B,P1,30H,40H
31、及5AH单元)的内容如何?,MOV R0,#30H MOV A,R0 MOV R1,A MOV B,R1 MOV R1,P1 MOV A,P1 MOV 40H,#20H MOV 30H,40H,最后结果为:R0=30H,R1=5AH,A=7FH,B=5AH,P1=7FH,(30H)=20H,(40H)=20H,(5AH)=7FH。,将下面的程序段填写完整,以实现要求的功能。12.内部RAM中以51H单元为首地址,存放着6个字节的无符号数。统计其中0的个数,并存放在50H单元中。源程序如下:CONT0: MOVR1,#51H MOVR2, MOV50H, LOOP: MOVA,R1 NEXT I
32、NC50HNEXT: INC DJNZR2, RET,将下面的程序段填写完整,以实现要求的功能。,13. 将内部RAM中首地址为30H的一个数据块传送到外部RAM首地址为3000H的区域,遇到传送的数据为零时停止。源程序如下:MI_O:MOVR1, MOVDPTR,#3000H LOOP:MOVA, JZ MOVXDPTR,AINC INC SJMPLOOPPRET:RET,14片内RAM30H开始的单元中有10个二进制数,请编程求它们之和(和256 )和存放在29H单元,ADDIO:MOV R0,30H MOV R7,#9 MOV A,R0 LOOP:INC R0 ADD A,R0 DJNZ
33、 R7,LOOP MOV 29H,A RET,15. 编程题 请编制两字节(16位)无符号数减法程序。其中被减数的高位数据存放在单片机片内RAM的21H单元、低位数据存放在20H单元中,减数的高位数据存放在23H单元、低位数据存放在22H单元,差值的高位和低位数据分别存放到片外扩展RAM的3001H和3000H地址单元中,程序以RET指令结束(程序名和程序中要使用的标号可以自行定义)。,SUIDATA: MOV DPTR,#3000HCLR CMOV A,20HSUBB A,22HMOVX DPTR,AMOV A,21HSUBB A,22HINC DPTRMOVX DPTR,ARET,注意:程序编制中要先减低位,后减高位数据,由于是从地址单元中取被减数和减数,地址单元前面都不能加#号,而差值单元由于是在片外扩展的3000H和3001H地址单元,间址寄存器应为DPTR。,