1、第四章 汇编语言程序设计,4-1 汇编语言基本概念,4-2 汇编语言程序设计,4-1 汇编程序基本概念,4-1-1 程序设计语言用于编制计算机程序的语言称为程序设计语言。按照语言的结构及其功能可以分为三种:机器语言、汇编语言、高级语言。,一、机器语言,用二进制代码0和1表示指令和数据的最原始的程序设计语言。其直接取决于计算机的结构,响应速度最快,但程序繁琐、难认、难记。,1)汇编语言指令与机器语言指令相对应,有效地利用存储空间。 2)指令直接访问CPU的寄存器、存储单元和I/O端口,可以充分发挥CPU的功能,满足实时控制的要求。 3)是面向机器的语言,使用者必须对机器的硬件结构、指令系统都要熟
2、悉。汇编语言程序的通用性差,程序移植起来不方便。,二、汇编语言 用汇编语言编写的、完成特定功能的指令序列。 特点有:,汇编,汇编语言程序到机器语言程序的转换过程称为汇编。 1.手工汇编:人工查指令表汇编。用于设计短小程序或调试程序的场合。 2.机器汇编:用汇编程序进行汇编。,三、高级语言高级语言是以接近于人的自然语言,面向过程而独立于机器的通用语言。必须经编译程序或解释程序进行翻译生成目标程序,机器才能执行。特点:简单、易学、通用性好,便于移植。但是,其目标程序占存储单元多,执行时间长;在MCS-51系列单片机开发应用中,单片机的C语言C51正得到越来越广泛的应用。,4-1-2 汇编语言的语句
3、结构,二、汇编语言的语句格式 汇编语言一般由四部分组成。格式如下:标号: 操作码 操作数 ; 注释START: MOV A, 30H ;A(30H)各部分之间须用分隔符,即在标号之后要加冒号“:”;在操作 码与操作数之间用空格间隔;在操作数内部用逗号“,”将源操作 数和目的操作数隔开;注释段用分号(;)隔开。,一. 汇编语言指令类型 1.机器指令:指令系统中的全部指令,每条指令有对应的机器代码。 2. 伪指令:汇编控制指令,仅提供汇编信息,没有指令代码。,4-1-3 伪指令 常用伪指令及其功能:,1. ORG起始地址指令:指明程序和数据块起始地址。 指令地址 机器码 源程序 ORG 2000H
4、 2000H 78 30 MAIN:MOV R0,#30H2002H E6 MOV A,R0ORG 3000H3000H 23 DB 23H,100,A 3001H 643002H 41,2. DB 定义字节型常数指令。 例: DB 12H,100,A,4. EQU 赋值。为标号或标识符赋值。 X1 EQU 2000H X2 EQU 0FH MAIN: MOV DPTR,#X1 ADD A,#X2,5. BIT 位定义。例:FLAG BIT 30H,3. DW 定义字型常数指令。 例: DW 1234H,5678H,6. END 结束汇编指令。,DS:定义存储区 从指定单元开始,保留一定数量存
5、储单元 ORG 0500H DS 8,4-2 汇编语言程序设计,一.分析问题,建立数学模型 二.确定算法 三.画程序流程图,四.分配内存单元五.编制源程序六.调试程序,4-2-1 汇编语言程序设计步骤,常用程序结构 顺序程序、分支程序、循环程序、子程序,4-2-2 顺序程序顺序程序又称简单程序,程序走向只有一条路径。,例1:双字节求补程序(设数据在R4R5中): MOV A,R5 ;取低字节 CPL A ADD A,#01H ;低字节变补 MOV R5,A MOV A,R4 ;取高字节 CPL A ADDC A,#00H ;高字节变补 MOV R4,A,例2:将30H单元内的两位BCD码拆开并
6、转换成ASCII码,存入RAM两个单元中。,ORG 2000H MOV A ,30H ;取值 ANL A,#0FH ;取低四位 ADD A,#30H, ;转换成ASCII码 MOV 32H ,A ;保存结果 MOV A ,30H ;取值 SWAP A ;高4位与低四位互换 ANL A,#0FH ;取低四位(原高4位) ADD A,#30H, ; 转换成ASCII码 MOV 31H ,A ;保存结果 SJMP $ END,4-2-3 分支程序 由条件转移指令构成程序判断框部分,形成程序分支结构。,单重分支程序 一个判断决策框,程序有两条出路。 两种分支结构:,例1: 求R2中补码绝对值,正数不变
7、,负数变补。ORG 1000H MOV A,R2JNB ACC.7,NEXT;为正数?CPL A ;负数变补INC AMOV R2,A NEXT:END ;结束,多重分支程序 一多次使用条件转移指令,形成两个以上判断框。,例2: 求符号函数Y=SGN(X)+1 当 X0 SGN(X)= 0 当 X=0-1 当 X0,ORG 0100H SYMB: MOV A,40H ;取XJZ STOR ;X=0,Y=XJB ACC7,MINUS;X0MOV A,# 1 ;X0,Y=+1SJMP STOR MINUS:MOV A,#FFH;X0,Y= -1 STOR: MOV 41H,A ;保存YRET,二按
8、分支号转移,如:分支号=0,程序转移到ADDR0处;当分支号=1,程序转移到ADDR1处; 。,(1)用地址表法。 例3:设分支号已存入A。 MTJS:MOV DPTR,#1000HB ;取表首地址CLR C ;分支号2RLC AMOV R2,AMOVC A,A+DPTR;取分支地址低位PUSH ACC ;入栈保存MOV A,R2INC AMOVC A,A+DPTR;取分支地址高位PUSH ACC ;入栈保存RET ;分支地址PC,转移 1000H: DW ADDR0 ;分支地址表DW ADDR1 ADDR0: ;程序段0 ,(2)转移表法。用分支转移指令 JMP A+DPTR。,例4: 根据
9、R0的值转向6个分支程序。R010,转向SUB0;R020,转向SUB1;R060,转向SUB5;,ORG 2000HMOV DPTR,#TAB;转移指令表首地址MOV A, R0 ;取数MOV B, #10 DIV AB ;A除10,商在A中CLR CRLC A ;A2AJMP A+DPTR ;PC A+DPTR TAB: AJMP SUB0 ;转移指令表AJMP SUB1AJMP SUB2AJMP SUB5,4-2-4 循环程序 包含多次重复执行的程序段,循环结构使程序紧凑。,循环程序的构成,一初始化部分 循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。,二循环体 需多次重复处
10、理的程序段。 三.循环控制部分 1.修改指针和循环控制变量。 2.检测循环条件:满足循环条件,继续循环,否则退出循环。 四.结束部分 处理和保存循环结果。,循环程序按结构形式,分为单重循环与多重循环。,单重循环 简单循环结构:循环体中不套循环。,例1:求n个单字节数据的累加,设数据串已在43H起始单元,数据串长度在42H单元,累加和不超过2个字节。,SUM: MOV R0,#42H;设指针MOV A,R0MOV R2,A ;循环计数器nCLR A ;结果单元清0MOV R3,A ADD1:INC R0 ;修改指针ADD A,R0 ;累加JNC NEXT ;处理进位INC R3 ;有进位,高字节
11、加1 NEXT: DJNZ R2,ADD1 ;循环控制:数据是否加完?MOV 40H,A ;循环结束,保存结果MOV 41H,R3RET,循环控制方法:计数控制、特征标志控制。,一.计数控制: 设循环计数器,控制循环次数。正计数和倒计数两种方式。 例2:为一串7位ASCII码数据的D7位加上奇校验,设数据存放在片外RAM的2101H起始单元,数据长度在2100H单元。,MOV DPTR,#2100HMOVX A,DPTRMOV R2,A NEXT:INC DPTRMOVX A,DPTRORL A,#80HJNB P,PASSMOVX DPTR,A PASS:DJNZ R2,NEXT DONE:
12、SJMP DONE,二.特征控制:设定循环结束标志实现循环控制。,例3:找正数表最小值。正数表存在片外RAM中以LIST为起始单元,用-1作为结束标志。,START:MOV DPTR,#LIST ;数表首地址MOV B,#127 ;预置最小值 NEXT: MOVX A,DPTR ;取数INC DPTR ;修改指针CJNE A,#-1,NEXT1;是否为数表结尾?SJMP DONE ;循环结束 NEXT1:CJNE A,B,NEXT2 ;比较 NEXT2:JNC NEXTMOV B,A ;保存较小值SJMP NEXT DONE: SJMP DONE,习题:统计一班考试为100分和不及格人数,成绩
13、在41H起始单元。,多重循环 循环体中套循环结构。以双重循环使用较多。,例4:将内存一串单字节无符号数升序排序。 步骤: 每次取相邻单元的两个数比较,决定是否需要交换数据位置。 第一次循环,比较N-1次,取到数据表中最大值。 第二次循环,比较N-2次,取到次大值。 第N-1次循环:比较一次,排序结束。,SORT: MOV A,#N-1 ;N个数据排序MOV R4,A ;外循环次数 LOOP1: MOV A,R4MOV R3,A ;内循环次数MOV R0,#TAB ;设数据指针 LOOP2: MOV A,R0 ;取二数MOV B,AINC R0MOV A,R0CJNE A,B,L1 ;比较 L1
14、: JNC UNEX ;AB,不交换DEC R0 ;否则交换数据XCH A ,R0INC R0MOV R0,A UNEX: DJNZ R3,LOOP2 ;内循环结束?DJNZ R4,LOOP1 ;外循环结束?RET,软件延时程序 用循环程序将指令重复多次执行,实现软件延时。,试计算延时程序的执行时间。源程序 指令周期(M) 指令执行次数,习题: DELAY:MOV R6,#100 1D1: MOV R7,#10 1D2: NOP 1DJNZ R7,D2 2DJNZ R6,D1 2RET 2 计算延时程序的执行时间(设时钟f=6MHz,M=1s)。,DELAY:MOV R6,#64H 1I1:
15、MOV R7,#0FFH 1I2: DJNZ R7,I2 2DJNZ R6,I1 2RET 2,延时时间计算:(设时钟f=12MHz) t=(11+1100+2100255+2100+21)M=51.3 ms,1 100 100255 100 1,4-2-5 子程序 子程序:能完成某项特定功能的独立程序段,可被反复调用。 调用子程序:就是暂时中断主程序的执行,而转到子程序的入口地址去执行子程序。子程序执行完毕,自动返回主程序,主程序再继续往下执行。,子程序设计 一子程序入口用标号作为子程序名。 二调用子程序之前设置好堆栈。 三用返回指令RET结束子程序,并保 证堆栈栈顶为调用程序的返回地址。
16、四.子程序嵌套须考虑堆栈容量。 五.提供足够的调用信息:如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。,子程序的类型 按子程序与主程序之间传递参数的方式分类。,入口参数:调用子程序之前,需要传给子程序的参数。 出口参数:子程序送回调用程序的结果参数。,选用不同的参数传递方式。 1.寄存器传送参数 2.存储器传送参数 3.堆栈传送参数,设计子程序应满足通用性的要求,不针对具体数据编程。 如:1.子程序功能为求单字节数的立方: AA3,入口参数和出口参数为A。 2.子程序功能为求单字节数的n次方: (41H)(42H)(40H)A,入口参数为(40
17、H)和A, 出口参数为(42H)(41H)。,例1:将R4R5R6中三个字节数据对半分解,变成6个字节, 存入显示缓冲区(DISMEM0DISMEM5)。,1)子程序UFOR1的功能:将A累加器中单字节数据,对半分解成两个字节,存入R0所指向的相邻两个单元 UFOR1:MOV R0,#0XCHD A,R0 ;保存低半字节INC R0 ;修改指针MOV R0,#0SWAP AXCHD A,R0 ;保存高半字节RET 2)调用子程序UFOR1之前,将待分解的内容送A,存放地址送R0。,例2:查表求出数据的ASCII码,再以字符形式输出。,1)子程序HEXASC功能:取出堆栈中数据,查表将低半字节转
18、换成ASCII码送累加器A。 2)分别将待转换数据入栈,然后调用子程序HEXASC。,MOV SP,#30HPUSH 40H ;入口参数入栈LCALL HEXASCPOP A HEXASC:DEC SP ;跳过返回地址DEC SPPOP A ;取入口参数 ;查表求ASCII码PUSH A ;保存出口参数INC SP ;指向返回地址INC SPRETDB 0,1, ;ASCII码表,4-2-6 位操作程序,例1:编写一程序,实现下图所示的逻辑运算电路。其中P3.1、P1.1、 P1.0分别是单片机端口线上的信息,RS0、RS1是PSW寄存器中的两个标志位,30H、31H是两个位地址,运算结果由P1.0输出。,ORG 0000H MOV C,P3.1 ANL C,P1.1 CPL C MOV 20H , C ;暂存数据 MOV C , 30H ORL C , /31H ANL C , RS1 ANL C , 20H ANL C , RS0 MOV P1.0 ,C ;输出结果 SJMP $,