1、第第4章章 汇编语言程序设计汇编语言程序设计周剑峰周剑峰1汇编语言简介汇编语言格式 计算机所能执行的每条指令都对应一组二进制代码。计算机所能执行的每条指令都对应一组二进制代码。为了容易理解和记忆计为了容易理解和记忆计算机的指令算机的指令,人们用一些英语的单词和字符以及数字作为助记符来描述每一条指令人们用一些英语的单词和字符以及数字作为助记符来描述每一条指令的功能。的功能。用助记符描述的指令系统用助记符描述的指令系统,称为机器的汇编语言系统称为机器的汇编语言系统,简称汇编语言。简称汇编语言。汇汇编语言也是面向机器的编语言也是面向机器的,每种计算机系统也都有它自己的汇编语言每种计算机系统也都有它自
2、己的汇编语言,用汇编语言编用汇编语言编写的程序写的程序,称为汇编语言源程序或汇编源程序。称为汇编语言源程序或汇编源程序。由25个英文字母组成的助记符至少一个空格用“,”隔开,操作个数可为无,1,2,3 由操作助记符和操作数字段组成汇编指令指能汇编成机器语言代码的指令。格式:操作码 操作数1,操作数2,操作数32汇编伪指令 伪指令:伪指令:汇编时不产生机器语言代码的指令,仅提供汇编控制信息。汇编时不产生机器语言代码的指令,仅提供汇编控制信息。一、定位伪指令一、定位伪指令 ORG m m:一般为十六进制数。:一般为十六进制数。m指出在该指出在该伪指令后的伪指令后的指令指令的汇编地址的汇编地址,即,
3、即生成的机器指生成的机器指令起始存贮器地址令起始存贮器地址。显然,当使用多条显然,当使用多条ORG m伪指令时,伪指令时,应注意其后生成的机器指令存放地址应注意其后生成的机器指令存放地址不应重叠不应重叠。例如例如:ORG 0START:SJMP MAIN ORG 0BH LJMP PTFO ORG 40H MAIN:3v二、定义字节伪指令v 标号:DB X1、X2 Xn例如例如:ORG 1000HDB 0AAH SR-DATA:DB25,25H DZX-DATA:DBMCS-51经汇编后,从地址经汇编后,从地址1000H处存贮器的内容为:处存贮器的内容为:(1000H)=AAH(1001H)=
4、19H(1002H)=25H(1003H)=4DH(1004H)=43H(1005H)=53H(1006H)=2DH(1007H)=35H(1008H)=31H4三、字定义伪指令三、字定义伪指令 标号:标号:DW Y1、Y2 Yn 通知汇编程序从当前通知汇编程序从当前ROM地址开始地址开始,保留存贮单元保留存贮单元,并存入并存入DW后面的数后面的数据。存放时高据。存放时高8位在前位在前,低低8位在后。位在后。例如:例如:ORG 1000H DW1234HSR_DATA:DW56H,2000经汇编后,从地址经汇编后,从地址1000H处存贮器的内容为:处存贮器的内容为:(1000H)=12H(10
5、01H)=34H(1002H)=00H(1003H)=56H(1004H)=07H(1005H)=D0H5v四、四、EQU EQU 赋值伪指令赋值伪指令 字符名称字符名称 EQU EQU 项(数或汇编符号)项(数或汇编符号)EQUEQU伪指令是伪指令是把把“项项”赋给赋给“字符名称字符名称”,注意这里的,注意这里的“字符名称字符名称”不同于标号(其后没有冒号),但它是必须的。不同于标号(其后没有冒号),但它是必须的。用用EQUEQU赋过值的符号名可以用作赋过值的符号名可以用作数据地址、代码地址、位地址或数据地址、代码地址、位地址或是一个立即数是一个立即数。例如例如:AAEQUR1MOVA,AA
6、 D10EQU10ADD_Y EQU07ABHMOVA,D10LCALLADD_Y6v五、五、DS定义存贮空间伪指令定义存贮空间伪指令 DS 表达式表达式 在汇编时,从指定地址开始在汇编时,从指定地址开始保留保留DSDS之后之后“表达式表达式”的值的值所规定的存贮单元。所规定的存贮单元。例如:例如:ORG 1000HDS07HDB20H,20 DW12H 经汇编后,从地址经汇编后,从地址1000H开始保留开始保留7个单元,然后从个单元,然后从1007H处存贮器的内容为:处存贮器的内容为:(1007H)=20H(1008H)=14H(1009H)=00H(100AH)=12H7v六、六、DATA
7、数据地址赋值伪指令数据地址赋值伪指令 字符名称字符名称 DATA 表达式表达式 这里的这里的“字符名称字符名称”与标号不同(其后没有冒号),但它是与标号不同(其后没有冒号),但它是必必须的须的,其功能是把,其功能是把“表达式表达式”的值赋给左边的的值赋给左边的“字符名称字符名称”。DATA伪指令与伪指令与EQU伪指令的主要区别是:伪指令的主要区别是:EQU定义的定义的“字符名称字符名称”必须必须先定义后使用先定义后使用,而,而DATA定义的定义的“字符名称字符名称”没有这种限制,故没有这种限制,故DATA伪指令通常用在源程序的开头或末尾。伪指令通常用在源程序的开头或末尾。例例如如:ORG010
8、0H AA DATA 35H DPTRA DATA0AA00H MOVA,AA ;(35H)A MOVDPTR,#DPTRA ;0AA00H DPTR8v七、七、BIT定义位地址符号伪指令定义位地址符号伪指令 字符名称字符名称 BIT 位位地址地址 这里的这里的“字符名称字符名称”与标号不同(其后没有冒号),但它与标号不同(其后没有冒号),但它是必须的,其功能是把是必须的,其功能是把BITBIT之后的之后的“位地址位地址”值赋给值赋给“字符名字符名称称”。例如例如:P11BITP1.1A2BIT02HMOVC,P11MOVA2,C八、汇编结束伪指令八、汇编结束伪指令 ENDEND指出汇编结束,
9、其后即使还有指令,汇编程指出汇编结束,其后即使还有指令,汇编程序也不作处理。序也不作处理。9汇编语言程序设计汇编语言程序设计方法 程序设计步骤程序设计步骤根据设计任务要求,采用汇编语言编制程序的过程。根据设计任务要求,采用汇编语言编制程序的过程。应用程序设计步骤:应用程序设计步骤:1.拟定任务书拟定任务书 2.建立数学模型建立数学模型 3.建立算法建立算法 4.绘制程序流程图绘制程序流程图 5.编制汇编语言源程序编制汇编语言源程序 6.上机调试上机调试 注意:注意:汇编调试汇编调试需要多次试验,需要多次试验,往往调试占整个往往调试占整个任务的大部分时任务的大部分时间间10程序设计要求及基本方法
10、程序设计要求及基本方法可靠性高可靠性高、可读性好可读性好、效率高、效率高、占用存储容量小占用存储容量小和和执执行速度快行速度快 汇编程序结构设计的基本方法:汇编程序结构设计的基本方法:汇编程序结构设计的基本要求:汇编程序结构设计的基本要求:1.1.顺序程序的设计顺序程序的设计 2.2.分支程序设计分支程序设计 3.3.循环程序设计循环程序设计 4.4.子程序设计子程序设计5.5.查表程序设计查表程序设计6.6.散转程序设计散转程序设计11一、顺序程序 顺序程序是最简单的程序结构,在顺序程序中没有顺序程序是最简单的程序结构,在顺序程序中没有任何的转移指令,以下是一个典型的例子。任何的转移指令,以
11、下是一个典型的例子。例例1:字节(双字)加法。将内部:字节(双字)加法。将内部RAM 30H开始的开始的4个单元中存放的个单元中存放的4字节十六进制数和内部字节十六进制数和内部RAM 40H单元开始的单元开始的4个单元中存放的个单元中存放的4字节十字节十六进制数相加,结果存放到六进制数相加,结果存放到40H开始的单元中。开始的单元中。(如如0a0ab234fh存放在存放在片内片内RAM30h开始的开始的4个单元如图所示个单元如图所示)30H31H33H32H加数加数 1 存放处存放处4FH23HABHA0H12题意分析示意图题意分析示意图 (1)题意分析。题意分析。题目的要求如图所示。30H3
12、1H33H32H加数加数 1 存放处存放处4FH23HABHA0H43H42H41H40H 7BH 56H 80H E8H加数加数 2 存放处存放处43H42H41H40HCAH79H2BH89H相加结果存放处相加结果存放处A0AB234FE880567B892B79CA113 ORG 0200HMOV A,30HADD A,40HMOV 40H,A;最低字节加法并送结果最低字节加法并送结果MOV A,31HADDC A,41HMOV 41H,A;第二字节加法并送结果第二字节加法并送结果(2)汇编语言源程序。汇编语言源程序。按照双字节加法的思路,实现按照双字节加法的思路,实现4字节加法的源程序
13、如下:字节加法的源程序如下:14 MOV A,32HADDC A,42HMOV 42H,A;第三字节加法并送结果第三字节加法并送结果MOV A,33HADDCA,43HMOV 43H,A;第四字节加法并送结果,进位第四字节加法并送结果,进位 位在位在CY中中 SJMP$END15分支程序v分支程序可以分为:v单分支v双分支v多分支16单分支v 单分支程序的基本结构:条件成立?条件成立?程序段程序段下条指令下条指令NY17双分支v 双分支程序的基本结构:程序段程序段1条件成立?条件成立?程序段程序段2NY18多分支v 多分支程序的基本结构:程序段程序段2条件条件N=?程序段程序段N-10N程序段
14、程序段1程序段程序段N1N-119v 例:如图所示,设计一段程序实现功能:如果(例:如图所示,设计一段程序实现功能:如果(A)中)中1的个数为奇数,的个数为奇数,所有的二极管发光;如果全所有的二极管发光;如果全0,则只让,则只让VD0-VD3发光;否则全灭。发光;否则全灭。单分支程序举例单分支程序举例20开始位P=1?(A)=0?P2FFHP200HP20FH结束YYNNv ORG 0200HORG 0200Hv JB PJB P,JISHUJISHUv JZJZ QUAN QUANv MOV P2MOV P2,#00H#00Hv SJMP SJMP TOendTOendvJISHU:MOV
15、P2,#0FFHJISHU:MOV P2,#0FFHv SJMP SJMP TOendTOendvQUAN:MOV P2,#0FHQUAN:MOV P2,#0FHvTOendTOend:SJMP$:SJMP$v END END流程图:流程图:源程序:源程序:判断奇偶标判断奇偶标志位的值志位的值判断判断(A)的值的值是否为是否为0(A)有偶数个有偶数个1,二极管灭二极管灭(A)有奇数个有奇数个1,二极管全亮二极管全亮(A)为为0,VD0-VD3亮亮注意:在注意:在MCS-51单片机中,实现单分支常单片机中,实现单分支常用的指令有:用的指令有:JZ、JNZ、DJNZ、CJNE、JC、JNC、JB、
16、JNB、JBC等。等。虚线框代表虚线框代表一个单分支一个单分支21双分支程序设计双分支程序设计例例:内部内部RAM的的40H单元和单元和50H单元各存放了一个单元各存放了一个8位无符位无符号数,请比较这两个数的大小,比较结果用发光二极管显号数,请比较这两个数的大小,比较结果用发光二极管显示(示(LED为低有效):为低有效):若若(40H)(50H),则,则P1.0管脚连接的管脚连接的LED1发光;发光;若若(40H)(50H),则,则P1.1管脚连接的管脚连接的LED2发光。发光。22 题意分析:题意分析:本例是典型的分支程序,根据两个无符号数的本例是典型的分支程序,根据两个无符号数的比较结果
17、(判断条件),分别点亮相应的发光二极比较结果(判断条件),分别点亮相应的发光二极管。管。v比较两个无符号数常用的方法是将两个数相减,比较两个无符号数常用的方法是将两个数相减,然后判断有否借位然后判断有否借位CYCY。若若CY=0CY=0,无借位,则无借位,则XYXY;若若CY=1CY=1,有借位,则有借位,则XYXY。程序的流程图如下图程序的流程图如下图所示。所示。23两数比较流程图两数比较流程图XYXY,LED1点亮点亮CY1?XY,YNLED2点亮点亮开始开始结束结束24 源程序如下:源程序如下:X DATA 40H;数据地址赋值伪指令数据地址赋值伪指令DATA Y DATA 50H OR
18、G1000H MOV A,X;(X)A CLRC;CY=0 SUBBA,Y;带借位减法,带借位减法,A-(Y)-CYA25 JC L1 ;CY=1,转移到转移到 L1 CLRP1.0 ;CY=0,(40H)(50H),点亮点亮P1.0 连连 接的接的LED1 SJMP FIN ;直接跳转到结束等待直接跳转到结束等待 L1:CLR P1.1 ;(40H)(A),),则则(A)(41H),),然后和然后和下一个字节进行比较,依次类推,最后(下一个字节进行比较,依次类推,最后(A)必定是最大值。必定是最大值。40H41H42H43H44H45H46H47H48H62开始开始R040H(数据区首地址)
19、数据区首地址)R207H(循环次数)循环次数)A(R0)(取第一个数)取第一个数)R0(R0)+1(指向下一个数)指向下一个数)B(R0)结束结束AB?NYA(B)(R2)-1=0?48H(A)NYv ORG1000Hv MOVR2,#07Hv MOVR0,#40Hv MOVA,R0v LOOP:INCR0v MOV B,R0v CJNE A,B,NEXv NEX:JNCNETv MOV A,Bv NET:DJNZ R2,LOOPv MOV 48H,Av SJMP$v END设定循环次数设定循环次数R1,R0作为数据指针,作为数据指针,指向数据区第一指向数据区第一个字节个字节取出下一个字节,取
20、出下一个字节,存入存入B如果如果(A)(B),则则(A)(B)次数到否,到则次数到否,到则取出取出(A)48H63n例:将片内例:将片内RAM中中20H-27H中的数据按照从小到大的顺中的数据按照从小到大的顺序重新排列。序重新排列。解题思路:见下图解题思路:见下图RAM地址地址20H21H22H23H24H25H26H27H原始数据原始数据66H11H10H34H67H01H89HA0H101H11H10H34H67H66H89HA0H201H10H11H34H67H66H89HA0H301H10H11H34H67H66H89HA0H401H10H11H34H66H67H89HA0H501H1
21、0H11H34H66H67H89HA0H601H10H11H34H66H67H89HA0H701H10H11H34H66H67H89HA0H数据排序程序数据排序程序64R120H,R0(R1)+1R3 08HB(R1),R2(R3)-1查找最小值并和查找最小值并和(R1)单元互换单元互换R3-1=0?ENDR1(R1)+1NY程序流程:程序流程:65v 程序清单:程序清单:ORG 1000Hv MAIN:MOV R1,#20H v MOV R3,#08HvLOOP1:MOV A,R1 ;R0(R1)+1v INC Av MOV R0,A v MOV A,R3 ;R2(R3)-1v DEC Av
22、 MOV R2,Av MOV B,R1v LOOP:MOV A,R0v CJNE A,B,MMv MM:JNC SS ;如果如果AB跳转跳转v MOV B,Av MOV 28H,R0 ;28h纪录最小值所在单元的编号纪录最小值所在单元的编号 v SS:INC R0v DJNZ R2,LOOPv MOV R0,28H ;最小值单元和最小值单元和20H单元内容互换单元内容互换v MOV A,R1 ;数据数据v MOV R0,Av MOV R1,Bv INC R1v DJNZ R3,LOOP1v END663.3.定时程序定时程序n单重循环延时单重循环延时 例例1:假设单片机的假设单片机的fosc=
23、12MHz,计算单片机执行下面程计算单片机执行下面程序消耗的时间。序消耗的时间。DELAY:MOV R5,#TIME ;1机器周期机器周期 MM:NOP ;1机器周期机器周期 DJNZ R5,MM ;2机器周期机器周期 RET ;2机器周期机器周期 执行完以上执行完以上4条语句条语句,所花时间所花时间:T=(1+(1+2)TIME)+2 1 s 推广计算式推广计算式:T(机器周期数机器周期数)=(循环体机器周期数循环体机器周期数)循环次数循环次数+初初始化机器周期数始化机器周期数67n 多重循环延时多重循环延时 例例1:假设单片机的假设单片机的fosc=12MHz,计算单片机执行下面计算单片机
24、执行下面程序消耗的时间。程序消耗的时间。DELAY2:MOV R3,#TIME1 ;1机器周期机器周期 LOOP1:MOV R2,#TIME2 ;1机器周期机器周期 LOOP2:NOP ;1机器周期机器周期 DJNZ R2,LOOP2 ;2机器周期机器周期 DJNZ R3,LOOP1 ;2机器周期机器周期 RET ;2机器周期机器周期 执行完以上执行完以上6条语句条语句,所花时间所花时间:T=(1+(1+(1+2)TIME2+2)TIME1+2)1 s68本章小结本章小结 本章要求:本章要求:掌握掌握MCS-51单片机汇编语言程序的基本格式单片机汇编语言程序的基本格式及伪指令;及伪指令;掌握程序的基本结构(顺序结构、分支结构、掌握程序的基本结构(顺序结构、分支结构、循环结构)和程序设计的基本方法;循环结构)和程序设计的基本方法;掌握子程序的设计方法及其参数传递方法;掌握子程序的设计方法及其参数传递方法;了解数制转换、算术运算、极值查找等典型程了解数制转换、算术运算、极值查找等典型程序的设计。序的设计。69The End70