收藏 分享(赏)

汇编语言程序设计.pptx

上传人:天天快乐 文档编号:778516 上传时间:2018-04-23 格式:PPTX 页数:86 大小:770.61KB
下载 相关 举报
汇编语言程序设计.pptx_第1页
第1页 / 共86页
汇编语言程序设计.pptx_第2页
第2页 / 共86页
汇编语言程序设计.pptx_第3页
第3页 / 共86页
汇编语言程序设计.pptx_第4页
第4页 / 共86页
汇编语言程序设计.pptx_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、,计算机硬件技术基础,汇编语言程序设计,第四章,主讲教师赵晓安,计算机科学与软件学院计算机基础教学部,本章重点,教学目标: 本章内容是软件编程的关键,地位重要。程序结构(顺序、分支、循环、子程序);应用实例;熟练掌握程序设计的思路方法和技巧;要求掌握典型算法;找到分析问题和解决问题的着眼点;学会抓住不同问题的规律性;举一反三,独立思考,有创意,有新意,独到。,一、将高级语言程序设计方法迁移到汇编语言程序设计中来二、分清可执行指令和非执行指令及其功能三、特别注意汇编语言是面向机器的, 要记住 CPU的资源; 存储器结构与寻址方式; I/O口、定时/计数器、中断系统等关键的参数; 寄存器间接寻址中

2、指针的选择和使用技巧。四、从宏观上看,MCS-51汇编语言程序的整体结构 从微观上看,微机中各组成部分是如何通过程序联系起来。,汇编语言程序设计的要点:,41 汇编语言程序设计基础42 MCS-51 单片机汇编语言程序设计,第四章 汇编语言程序设计,411 汇编语言指令的分类412 汇编语言的格式413 伪指令414 汇编语言源程序的汇编415 汇编语言程序设计的一般步骤,41 汇编语言程序设计基础,1汇编语言的指令类型 MCS-51单片机汇编语言,包含两类不同性质的指令。 (1)可执行指令:即指令系统中的指令。它们都是机器能够执行的指令,每一条指令都有对应的机器码。(基本指令) (2)伪指令

3、:汇编时供汇编程序识别和执行的指令,用于在汇编过程中对数据的存储环境等实施的控制。它们都是机器不执行的指令,无机器码。 (非执行指令),4.1.1 汇编语言的指令分类,4.1.2 汇编语言的格式,2、可执行指令格式:,3、伪指令格式:,或,标号:定义符 项表 ;注释,名字 定义符 参数,参数;注释,汇编语言一般由四部分组成。,1 标号段 标号段位于语句的开头,指明标号所在指令的首地址,标号又称为标号地址或符号地址,是一个可选项,只有需要时才设置。 由英文字母开头,不能超过8个字符; 绝对不允许把指令的保留字、寄存器号及伪指令字符作为语句的标号; 同一 标号在同一程序单位中只能出现一次。2、 操

4、作码段 操作码段可以是可执行指令的助记符,操作码段用于指示计算机进行何种操作,因此,是任何一条语句中的必选项,汇编语言根据这一字段生成目标代码。 操作码段也可以是伪指令的定义符,对汇编程序下命令,在汇编时起作用。,LOOP: MOV A,R0 DJNZ R2,LOOP,3、操作数段 操作数段用于存放指令的操作数或操作数地址 , 操作数的个数因指令的不同而不同,通常有三种情况: 无操作数 RET 单操作数 JC LOOP 双操作数 MOV A,B 操作数有5种表示形式: (1) 操作数是立即数,可用二进制、十进制和十六进制形式 (2) 作寄存器、寄存器间址和特殊功能寄存器名 MOV A,PSW

5、(3) 直接地址、标号地址 DJNZ R7,NEXT (4) 带加、减运算符的表达式 ,例:MOV A,#100-1 (5) $符号4、 注释段:注释指令或程序的含义,便于阅读程序、维护程序。 必须用“;”隔开,续行时,也必须以“;”开头 。,413 伪指令,定义:在机器汇编时供汇编程序识别和执行的指令,用来对汇编过程进行某种控制,或对符号、标号赋值,在汇编时不产生目标代码。起始汇编伪指令:ORG结束汇编伪指令:END定义字节伪指令:DB 定义字伪指令: DW定义位伪指令: BIT赋值伪指令: EQU DATA,汇编起始伪指令,格式: ORG 16位地址功能:指定汇编源程序编译成机器语言程序

6、的起始地址例如: ORG 1000HStart: MOV A,#5AH SJMP $ END,程序中可以有多条ORG语句,但定义的起始地址既不要交叉,也不要重叠。必须从小地址向大地址分配程序所占空间。,汇编结束伪指令,格式: 标号: END功能:停止汇编示例: ORG 0000H Ljmp 0100H ORG 0100H Start: mov A,#5Ah sjmp $ END,一个源程序可以包含主程序和若干个子程序,但在程序最后必须有且只能有一条END指令。,注意:,定义字节伪指令,格式: DB 功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个8位二进制数或多个用逗号隔

7、开的8位二进制数, 8位二进制数可以是二进制、十进制、十六进制或以引号括起来的字符串。,该指令只能为程序存储器赋初值。,注意:,1000H,11H,FFH,41H,42H,程序存储器,43H,44H,补码,ASCII码, ,ORG 1000HDat: DB 11h,-1,A,BCD END,定义字伪指令,格式: DW 功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表是一个字(两字节),16位二进制数。 ORG 1000HDat: DW 1122h,3344h,-1 END,1000H,11H,22H,33H,44H,程序存储器,只对程序存储器起作用,FFH,FFH,定义位伪指令,格

8、式:符号名 BIT 位地址 功能:给位地址定义一个符号名U BIT 20H.0V BIT 20H.1W BIT 20H.2X BIT P1.0Y BIT P2.4Z BIT P3.2Q BIT TCON.2,注意: 符号名不可以是助记符, 也不可以是寄存器名。例:A bit p1.0 是不可以的,赋值伪指令,格式:符号名 EQU 数据 功能:给符号名赋值 X EQU 05H Y EQU 06H NEXT EQU 2000H,注意:“符号名”必须先赋值后使用; 在程序它即可作为数据,也可作为地址; 所赋的值既可是8位的,也可是16位的。,赋值伪指令,格式:符号名 DATA 表达式功能:给符号名赋

9、值(8位) ONE DATA 30H (数据或地址) TWO DATA ONE+1格式:符号名 XDATA 表达式功能:给符号名赋值(16位),DATA(XDATA)与EQU伪指令功能相似,不同之处为: EQU必须“先定义后使用,而DATA(XDATA)没此规定。,414 汇编语言源程序的汇编,汇编可分成两种:人工汇编机器汇编 机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。,汇编,机器语言目标程序,汇编语言源程序,汇编程序,汇编,机器语言目标程序,汇编语言源程序,人工查指令机器码表,

10、414 程序设计的方法,结构化设计模块化设计开发方法自底向上开发先底层开发自顶向下开发先顶层开发混合方法,底,顶,416 汇编语言程序设计的一般步骤,分析题目,确定算法根据算法画出流程图根据流程图编写程序上机汇编和调试,排除错误,流程图图例,起止框处理框判断框连线,程序设计步骤流程图,421 简单程序设计422 分支程序设计423 循环程序设计424 运算程序设计425 查表程序设计426 散转程序设计427 子程序设计,42 MCS-51 单片机汇编语言程序设计,421 简单程序设计,特点: 从第一条指令开始依次执行每一条指令,直到程序执行完毕,中间没有转移指令,没有分支。 只有一个入口一个

11、出口。,入口,出口,ORG 1000HMOV R0,#30HMOV A,R0ANL A,#0FHORL A,#30HINC R0MOV R0,A,MOV A,30HANL A,#0F0HSWAP AORL A,#30HINC R0MOV R0,ASJMP $END,1、例43 两位压缩的BCD码转换成相应的ASCII码存储 两位压缩的BCD码指两位BCD数占一个单元, 相应的ASCII码占二个单元算法1 ANL 拆字、ORL #30H拼字,算法2 DIV 拆字、 ADD #30H 拼字,86,30H,36,31H,38,32H,R0,2、例44 将8位无符号二进制数转换成三位BCD码存储 8位

12、无符号二进制数占一个单元, 个位、十位和百位各占一个单元算法1 DIV 100 得百位,再DIV 10 的十位和个位,ORG 2000HBAI DATA 32HSHI DATA 31HGE DATA 30H MOV A,40H MOV B,#100 DIV AB MOV BAI, A,MOV A,BMOV B,#10DIV ABMOV SHI,AMOV GE, BSJMP $END,算法2 DIV 10 的个位,再DIV 10 的十位和百位,01H,30H,02,31H,06,32H,126,40H,分支程序结构流程图,1分支程序的三种基本形式,入口,出口,入口,入口,出口,出口,4.2.2

13、分支程序设计,(1)先建立可供条件转移指令测试的条件。 (2)选用合适的条件转移指令。(3)在转移的目标地址处设定标号。,2. 分支程序的设计要点,根据不同的条件,执行不同的程序段。 JZ、JNZ、JC、JNC、JB、JNB、JBC、CJNE 、DJNZ正确合理地运用,1) 用条件转移语句实现二分支,举例,mov A,R0 Jnz L1L1: mov R1,AL2: sjmp $ end,y= x x0,(R0)x,(R1)y,判零,分支间隔离,sjmp L2,mov A,R0 Jz L1 mov R1,A sjmp L2L1: mov R1,#0L2: sjmp $ end,y=,(R0)x

14、,(R1)y,举例,0 x=0 x x0,判零,分支间隔离,实现三分支举例,mov A,R0 Jz L2 Jnb ACC.7,L1 mov R1,#0FFh sjmp L3L1: mov R1,#01h sjmp L3L2: mov R1,#0L3: sjmp $ end,y=,(R0)x,(R1)y,判正负,判零,2) 用cjne与jc/jnc配合实现三分支,Cjne编程要点: 1、两个无符号数比较 1)两数相等 =,顺序执行; 2)两数不等于则转移;判c (1)用jc指令判小于 2、如何实现 ? ?,Cjne指令实现三分支流程图1,Cjne指令实现三分支流程图2,Cjne指令实现三分支流程

15、图3,大于等于,用cjne实现三分支,cjne R0,#0,L1 mov R1,#0 sjmp L3L1: mov A,R0 jnb ACC.7,L2 mov R1,#0FFh sjmp L3L2:mov R1,#01hL3:sjmp $ end,y=,(R0)x,(R1)y,JNC L2,判正负,判零,y=,(R0)x,(R1)y,2、判正负,CJNE R0,#0,NZERO,CLR CMOV A,R0SUBB A,#0JZ ZERO,MOV A,R0 JZ ZERO,其它方法?,分析:,1、判零,MOV A,R0JNB ACC.7, positive,CJNE R0, #7FH, DO1

16、SJMP positiveDO1: JC positive ;negativePositive:. 0FFH80H negative 00H7FH positive,补码表示,ORG 1000H ONE DATA 30H TWO DATA 31H MAX DATA 32H CLR C MOV A ,ONE SUBB A ,TWO JZ XMAX JB ACC.7 , NEG JB OV , YMAX SJMP XMAX NEG:JB OV , XMAXYMAX:MOV A ,TWO SJMP RMAX XMAX:MOV A , ONERMAX:MOV MAX , A SJMP $ END,例4

17、6 ONE和TWO单元中的两个带符号数比较大小,将较大者存入MAX单元中。两数相等则任一个存入MAX即可。,若XY差的符号位为1,则OV=0,XY,若XY差的符号位为0,则OV=0,XY ; OV=1,XY,P108,pass,423 循环程序设计,循环程序通常有两种编制方法循环结构程序的组成循环程序结构循环问题的类型循环程序设计举例,1、先循环处理后循环控制,称为直到型循环;,2、 先循环控制后循环处理,称为当型循环。,1.循环程序通常有两种编制方法,2、循环结构程序的组成,循环初始化: 循环控制变量的初始化、 工作寄存器、数据变量的初始化循环处理部分:循环体,重复执行的部分循环控制部分:循

18、环体,修改循环变量、控制循环的执行循环结束处理部分:这部分程序用于存放执行循环程序所得结果以及恢复各单元的初值。,3循环程序的结构, 循环程序按结构形式,有单重循环与多重循环。 在多重循环中,只允许外重循环嵌套内重循环。不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部。,循环问题的类型,1、计数型,循环次数已知,用计数方法控制循环的终止。,2、条件型,循环次数未知,根据某种条件判断是否终止循环。,3、计数型+条件型,1、单循环,2、多重循环,例47 内部RAM块传,遇到“#”字符结束。,例3:50ms延时程序例48 8031外部RAM中数据的冒泡排序法,循环程序设计举例,例1:内

19、部数据区清零例47 内部RAM块传,数据块长度已知,例1:内部数据区清零,ORG 0000HZero: mov R0,#30H mov R7,#10 mov A,#00HLoop: mov R0,A inc R0 djnz R7,Loop sjmp $ END,30H,R0,0,0,0,0,0,0,10个,计数型单循环程序举例,例3:50ms延时程序,Delay: mov R7,#200Del1: mov R6,#123 nopDel2: djnz R6,Del2 djnz R7,Del1 sjmp $ ; (不计入),;1机器周期;1机器周期;1机器周期;2机器周期;2机器周期,T =200

20、(1+1+1232+2)+11us =50001us=50ms,例47把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为 起始地址的区域,数据块长度在R1中。参考程序如下:ORG2000HBLK1EQU30HBLK2EQU1000H N EQU 100 MOVR0 ,#BLK1 ;BLK1数据块起始地址MOVDPTR ,#BLK2 ;BLK2数据块起始地址 MOV R1, #N ; 块长度 XH: MOVA ,R0 ;取数据MOVX DPTR ,A ;数据传送INCR0INCDPTR DJNZ R1,XH ;循环控制 计数 STOP:SJMP$END,计数型,增加,例47把内

21、部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为 起始地址的区域,直到遇到“#”字符的ASC码为止。去掉块长度。参考程序如下:ORG2000HBLK1EQU30HBLK2EQU1000H MOV SP,#6FH MOVR0 ,#BLK1 ;BLK1数据块起始地址MOVDPTR ,#BLK2 ;BLK2数据块起始地址XH: CLRCMOVA ,R0 ;取数据PUSHACCSUBBA ,#23H ;判是否为“#”字符JZSTOPPOPACCMOVXDPTR ,A ;数据传送INCR0INCDPTRAJMP XH ;循环控制 STOP:SJMP$END,条件型,改为条件型,例48 设

22、单片机8031外部RAM从3600H单元开始存放有100个无符号数,试编写程序能使它们按从小到大的顺序排列。(最小的数放在3600H单元) 解:采用冒泡排序法,设对5个数排序。,关键是循环控制方法其次: 1)存取数据指令: MOVX 指针 DPTR R0/R1+P23) 两单元数据交换,根据冒泡排序的思路设计程序,设计要点:,85429,5428,425,24,第一轮比较4次,第二轮比较3次,第三轮比较2次,第四轮比较1次,98542,89542,85942,85492,8542,5842,5482,542,42,452,对 n 个数,则要进行n-1轮扫描,在第 i 轮扫描中要进行 n-i 次

23、比较。,可以推知:,若将原始数据改为 9 8 2 4 5 ,则排序过程如下:,82459,2458,245,24,第一轮比较4次,第二轮比较3次,第三轮比较2次,第四轮比较1次,98245,89245,82945,82495,8245,2845,2485,245,24,245,可以看出:,第三轮排序中没有发生交换,即第三轮结束后,已经排好了,应结束排序,不必再排第四轮。为此增加一个“排好序标志位”,预先将它清0,当产生交换时,将它置1,表示没排好,可以进行下一轮排序,否则,结束排序。,冒泡法排序流程图,36H 00H 01H 02H 03H 04H 05H 06H,P2,R0,R1,9,8,取

24、数交换,30H,A,movx A,R0mov 30h,Amovx A,R1movx R0,Axch A,30Hmovx R1,A,8051外部RAM,9,9,8,8,9,8,9,A,Cjne A, 30h, ,Jnc ,冒泡法排序,ORG 0000h mov P2,#36h mov R2,#100-1Loop0:mov R0,#00h mov R1,#01h mov 03h,R2 clr 7Fh;排好序标志清0Loop1:movx A,R0 mov 30h,A movx A,R1 cjne A,30h,Loop2 sjmp L1,Loop2:JNC L1 ; 小到大,JC 大到小 movx R

25、0,A xch A,30h movx R1,A setb 7Fh;排好序标志置1L1: inc R0 inc R1 djnz R3,Loop1; 轮内次数 jnb 7Fh,Loop3;排好序标志 djnz R2,Loop0; 轮数Loop3:sjmp $ END,交换,424 运算程序设计,算术运算程序 两个多字节数加法 8位二进制带符号数加法 多字节BCD码减法 ASCII码二进制 多字节左移加乘法 多字节乘法,用MUL指令,逻辑运算程序 与逻辑简单实例多字节左移一位数据的拼装,ORG 0000HJIA: MOV R0,#40H MOV R1,#50H MOV R2,#4 CLR CJIA1

26、:MOV A,R1 ADDC A,R0 MOV R0,A INC R0 INC R1 DJNZ R2,JIA1 MOV F0,C SJMP $ END,用三个指针怎么做?,两个多字节数加法,ORG 1000HMOV R0,#40H MOV R1,#50H MOV R2,#4 SETB RS0 MOV R0,#60H CLR RS0 CLR CLOOP: MOV A,R0 ADDC A,R1 INC R0 INC R1,SETB RS0 MOV R0,AINC R0CLR RS0DJNZ R2,LOOPMOV F0,CSJMP $END,+,0区R0,0区R1,1区R0,40H,50H,60H,

27、例:24H + 56H= 7AH,(R0),(R0),(R0),0区,1区,2区,问:下例怎么设计?,例420 8位二进制带符号数加法,ORG 2000HBLOCK DATA 30HSUM DATA 40H MOV R2,#0 ;高8位先设为0 MOV R3,#0 MOV R0,#BLOCK;R0指向被加数 MOV R1,#SUM;R1指向和 MOV A ,R0 ;取出被加数 JNB ACC7,N1;若是正数转移到N1 MOV R2,#0FFH;若是负数高8位为全1N1: INC R0 ;修改R0指针 MOV B,R0 ;取加数到B JNB B7,N2 ;若是正数转移N2 MOV R3 ,#0

28、FFH ;是负数高8位为全1N2: ADD A,B ;低8位相加 MOV R1,A ;存低8位和 INC R1 ;修改R1指针 MOV A ,R2 ;准备加高8位 ADDC A ,R3 ;高8位相加 MOV R1,A ;存高8位和 SJMP $ END,R2,R3,R3,R2,00H,00H,30H,31H,41H,40H,正数,补码,pass,例422 多字节BCD码减法运算程序,9A 9A 9A 9AH - 44 55 66 77H ? ? ? ? 99 88 77 66H,求一个字节的补就加一个字节,先求所有字节的补再加所有字节,+,P123,ORG 0000HJIA: MOV R0,#

29、40H MOV R1,#50H MOV R2,#4 CLR CJIA1:MOV A,#9AH SUBB A,R1 ADD A,R0 DA A,CPL C MOV R0,A INC R0 INC R1 DJNZ R2,JIA1 MOV F0,C SJMP $ END,9AH -77H 23H +66H 89HCY=1 9AH 66H 1 33H+77H AAH+66H 10HCY=0,9A9AH,多字节BCD码减法,9A 9A 9A 9AH - 44 55 66 77H ? ? ? ? 99 88 77 66H ? ? ? ?,+,99 88 77 66H - 44 55 66 77H 55 3

30、3 10 89H,说明:直接相减无借位,求补相加 有进位,反之亦然。,例:多个单字节数求累加和,ORG 0000HSUM: mov R3,#0 mov R4,#0 mov R0,#50H mov R2,#5Loop: mov A,R4 add A,R0 mov R4,A inc R0 clr A addc A,R3,mov R3,A djnz R2,Loop sjmp $ END,累加和单元要先请零,ASCII码二进制,ORG 0000HAtoB: MOV A,#A CLR C SUBB A,#30H CJNE A,#0AH,NEQ SJMP BIGNEQ: JC AENDBIG: SUBB

31、A,#07HAEND:SJMP $ END,开始,结束,(A) (A)-07H,(A) =10?,(Cy)=1?,Y,N,Y,N,(A) ASCII (cy)0,(A) (A)-30H,数据的拼装,x7x6x5x4x3x2x1x0 (20H)y7y6y5y4y3y2y1y0 (21H)y2y1y0x4x3x2x1x0 (30H) ORG 0000HSTART: MOV 30H,20H ANL 30H,#00011111B MOV A,21H SWAP A RL A ANL A,#11100000B ORL 30H,A SJMP $ END,与逻辑简单实例,P1.7 P1.6 P1.5 P1.4

32、 P1.3 P1.2 P1.1 P1.0,执行主程序的逻辑函数:F=P1.6 P1.4 P1.2P1.2准备就绪信号,为“1”表示就绪P1.4主回路工作正常信号,为“1”表示正常P1.6启动开关闭合信号,为“1”表示闭合程序片段: WAIT: MOV A,P1 ;(P1)=XXXXXXXXB ANL A,#54H; 01010100B CJNE A,#54H,WAIT;F=1? MAIN: ;主程序,多字节左移一位,B3L: CLR CLOOP: MOV A,R0 RLC A MOV R0,A INC R0 DJNZ R2,LOOP RET END,ORG 2000H MAIN : MOV S

33、P,#5FH MOV R0,#30H MOV R2,#3 ACALL B3L SJMP $,1、MOVC A ,A+DPTR查表: 1) 数据表格表头地址存入DPTR, 2) 要查数据的项数送入累加器A, 3) 最后MOVC A ,A+DPTR完成查表,可在64KB内查表。DPTR可以人为修改。,4.2.5 查表程序设计实现查表算法,查表算法: 1、事先计算或实验数据按一定顺序编成表格, 存于程序存储器内;(用DB 、DW伪指令) 2、然后根据输入参数值,从表中取得结果。,查表指令:,MOVC A ,A+DPTR,64KB内查表,MOVC A ,A+PC,一页(255B)内查表,查表程序设计,

34、2、MOVC A,A+PC查表:分为三步: 1)用传送指令把所查数据的项数送入累加器A; 2)使用ADD A ,#data指令对累加器A进行修正, data值由下式确定: data=数据表头地址-PC当前值 实际上data值等于查表指令和数据表格之间的字节数; 3)用指令MOVC A , A+PC完成查表 由于PC指针只能在A中提供的偏移地址的范围内查表,故,查表范围在包含PC当前值的256个字节范围内。,PC当前值+3=,PC,TAB +0,0123,TAB +2,PC当前值,3B,PC当前值+3+2=,表头,(A),修正值=表头地址-PC当前值,表中偏移量,ORG 1000h MOV A,

35、#2 ADD A ,# 03H;计算偏移量 MOVC A ,A+PC;查表 MOV R0 , A;存结果 SIMP $ TAB: DB 0, 1,2, 3,4 DB 5,6,7,8,9,用查表法获得09范围内某个数的相应ASCII码(设这个数为2),org 1000H MOV A,#2 MOV DPTR,#TAB MOVC A ,A+ DPTR ;查表 MOV R0 , A;存结果 SIMP $,1000H,1004H,ORG 0100H MOV A ,R0;取转换值 ANL A ,# 0FH;屏蔽高四位 ADD A ,# 03H;计算偏移量 MOVC A ,A+PC;查表 MOV R0 , A;存结果 SIMP $ASCTAB: DB 0,1,2,3 DB 4,5,6,7 DB 8,9,A,B DB C,D,E,F END,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报