收藏 分享(赏)

第4章 汇编语言程序设计.ppt

上传人:kuailexingkong 文档编号:1705348 上传时间:2018-08-19 格式:PPT 页数:76 大小:2.88MB
下载 相关 举报
第4章 汇编语言程序设计.ppt_第1页
第1页 / 共76页
第4章 汇编语言程序设计.ppt_第2页
第2页 / 共76页
第4章 汇编语言程序设计.ppt_第3页
第3页 / 共76页
第4章 汇编语言程序设计.ppt_第4页
第4页 / 共76页
第4章 汇编语言程序设计.ppt_第5页
第5页 / 共76页
点击查看更多>>
资源描述

1、徐医医学影像学院,第四章 汇编语言程序设计,4.1 汇编语言的基本概念 4.2汇编语言程序编程及开发环境 4.3 程序设计,徐医医学影像学院,第四章 汇编语言程序设计,4.1 汇编语言的基本概念 4.2汇编语言程序编程及开发环境 4.3 程序设计,徐医医学影像学院,一、概述,汇编语言是一种面向CPU指令系统的程序设计语言。指令格式:,1、标号是指该指令的符号地址,以冒号结束; 2、用助记符表示操作码,是指令名称的代表符号,是语句中的关键字,不可缺省;,徐医医学影像学院,一、概述(续上页),3、用符号代表操作数或操作数地址。 操作数是本指令执行需要的数据。 有些指令不需要指明操作数,可以默认;有

2、些指令需要两个操作数;还有些操作数可以用表达式。 4 、注释项是可选项,用分号开始。,徐医医学影像学院,一、概述(续上页),汇编语言源程序:用汇编语言编写的程序称为源程序,计算机不能识别和执行源程序。 目标程序:计算机能直接识别和执行的机器码程序,称为目标程序。 汇编(过程):将汇编程序源程序翻译成机器码目标程序的过程,称为汇编过程,简称汇编。 汇编程序:用于把汇编语言源程序翻译成目标程序。,徐医医学影像学院,二、伪指令,伪指令,非执行指令,只是在对源程序进行汇编的过程中起某种控制作用,如设置目标程序或数据存储器的起始地址、判断源程序是否结束等。 伪指令汇编后不产生目标代码。例如:,机器码,徐

3、医医学影像学院,1、ORG,格式: ORG 16位地址 功能:用来设定程序或数据存储器的起始地址。 例如:,org 2000h start:mov r0,#12H,表示程序的起始地址是2000h,第一条指令从 2000h开始存放。,徐医医学影像学院,指令在程序存储器中的存储,徐医医学影像学院,2、END,功能:汇编语言源程序结束的伪指令,表示源程序结束。 一个源程序只能有一个END指令,放在程序的末尾。 例如:,org 2000h start:mov r0,#12Hend,徐医医学影像学院,3、EQU,格式: 字符名称 EQU 数或汇编符号 功能:把操作数段中的地址或数据赋值给字符名称。经赋值

4、后的字符名称,其值在整个程序中不改变,且可多次使用。 例如:,count equ 16h ;count=16h mov a,count ;A=(16h),徐医医学影像学院,4、DB,格式: 标号 DB 字节常数表 功能:定义字节数据,从指定的地址单元开始,存储若干个字节数据或ASCII码字符,常用于定义数据常数表。 例如:,org 2000h Tab:DB 14h,26,A,汇编结果: (2000H)=14h,(2001H)=1AH (2002H)=41H,徐医医学影像学院,5、DW,格式: 标号 DW 字常数表 功能:定义字数据,从指定的地址单元开始,存储若干个字数据,常用于定义地址表。 一

5、个字占两个存储单元,其中高字节存入低位地址,低字节数存入高位地址。 例如:,org 2000h Tab:DW 7423h,26,汇编结果: (2000H)=74h,(2001H)=23H (2002H)=00H,(2003H)=1AH,徐医医学影像学院,6、DS,格式: 标号 DS 表达式 功能:定义存储区,从指定的地址单元开始,保留一定数量的存储单元,以备程序使用。其中表达式一般是数值,即要保留的内存单元个数。 例如:,org 2000h DS 5 DB 23H,汇编结果: 从地址2000H开始,保留5个字节的内存单元, 而(2005H)=23H。,徐医医学影像学院,7、BIT,格式: 字符

6、名称 bit 位地址 功能:位地址符号指令,把位地址赋给所规定的字符名称,常用于定义位符号地址。 例如:,AA bit P1.0 BB bit P2.0,汇编结果: 把位地址P1.0、P2.0分别赋给变量AA和BB, 在程序中他们就是位地址。,setb AA clr BB,徐医医学影像学院,8、DATA,格式: 字符名称 data 表达式 功能:数据地址赋值指令,将数据地址或代码地址赋给所规定的字符名称。 与EQU不同,可以先使用,后定义。 例如:,MN data 1000H,汇编结果: MN的值为1000H。,徐医医学影像学院,ORG 1000H LEN EQU 10H START:MOV

7、A,#LENADD A,#30HSJMP $ORG 2000H TAB1:DB 32H,0A7H TAB2:DW 324AH,3CH TAB3:DS 5 END,1000H,徐医医学影像学院,标号,8086/8088汇编语言中使用的标号必须遵循下列规则: (1)由1-8个字母或数字串组成; (2)必须以字母开头; (3)不能重复定义; (4)不能使用指令助记符、伪指令或寄存器名来做标号。有效标号:START MY_PROGRAM无效标号:MAIN% 1BETA org r0,徐医医学影像学院,第四章 汇编语言程序设计,4.1 汇编语言的基本概念 4.2汇编语言程序编程及开发环境 4.3 程序设

8、计,徐医医学影像学院,两款汇编软件介绍,51汇编集成开发环境 Keil软件,徐医医学影像学院,51汇编集成开发环境,“新建”编辑源程序 “汇编” “反汇编” ,徐医医学影像学院,徐医医学影像学院,Keil软件,Keil 是美国Keil Software公司出品的51系列兼容单片机软件开发环境,是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编、PLM 语言和C语言的程序设计。 Keil 软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,界面友好,易学易用。,徐医医学影像学院,Keil软件启动界面,徐医医学影像学院,1、建立一个新工程 单击Projec

9、t菜单,在弹出的下拉菜单中选中New Project选项,如图所示。,图 新建工程文件,徐医医学影像学院,2、然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51,如图所示,然后点击保存。,图 新建工程文件的保存路径,徐医医学影像学院,3、弹出对话框,要求选择单片机的型号,keil几乎支持所有的51核的单片机,以Atmel的89C51来说明,如图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。,图 选择单片机的型号,徐医医学影像学院,4、完成上一步骤后,屏幕如图所示。,图 完成新建工程文件,徐医医学影像学院,下面可以编写程序。 5

10、、在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项。,图:新建文档,图:完成新建文档,徐医医学影像学院,建议首先保存该空白的文件,单击菜单上的“File”“Save As”选项单击,汇编语言扩展名为.asm(C程序.c)。单击“保存”按钮。 如图所示。,图:保存新建文档,徐医医学影像学院,6、回到编辑界面后,单击“Target 1”前面的“”号,然后在“Source Group 1”上单击右键,弹出菜单如图。,图:打开添加文档界面,徐医医学影像学院,单击“Add File to Group Source Group 1”,如图所示。,图: 添加文档,徐医医学影像学院,选中Tes

11、t1.asm,然后单击“Add ” ,如图所示。,7、现在便可输入程序了,输入完毕进行调试便可运行。,图:完成添加文档,徐医医学影像学院,第四章 汇编语言程序设计,4.1 汇编语言的基本概念 4.2 汇编语言程序编程及开发环境 4.3 程序设计,徐医医学影像学院,4.3.1 顺序程序,顺序程序是一种最简单,最基本的程序。,特点:程序按编写的顺序依次往下执行每一条指令,直到最后一条。,例4.3.1 有一变量存放在片内RAM 20H单元,其取值范围为:00H05H,编程实现:求变量的平方值,并存入片内RAM 21H单元。,分析:,返回本节,徐医医学影像学院,步骤:,1. 送表头首地址,2. 取X到

12、A,3. 求X2 存于A,4. 将X2存于内部RAM 21H,ORG 1000H,START: MOV DPTR ,#TABLE,MOV A , 20H,MOVC A ,A+DPTR,MOV 21H , A,SJMP $,TABLE: DB 00H, 01H, 04HDB 09H, 10H, 19H,ORG 2000H,5. 建立平方表,徐医医学影像学院,例4.3.2 三字节无符号数加法。 一个加数存放在内部RAM 50H,51H,52H单元,另一个加数存放在内部RAM 60H,61H,62H单元,将相加结果存入50H,51H,52H单元。进位存放在位寻址区的00H位。按低字节对应低地址存放。

13、,分析:,+,00,徐医医学影像学院,ORG 0000h LJMP START ORG 1000H START:MOV A, 50HADD A, 60HMOV 50H,AMOV A, 51HADDC A,61HMOV 51H,AMOV A, 52HADDC A, 62HMOV 62H,AMOV 00H,CSJMP $,徐医医学影像学院,ORG 2000H START: MOV A,30H ;取值ANL A,#0FH ;取低4位ADD A,#30H ;转换成ASCII码MOV 32H,A ;保存结果MOV A,30H ;取值SWAP A ;高4位与低4位互换ANL A,#0FH ;取低4位(原来

14、的高4位)ADD A,#30H ;转换成ASCII码MOV 31H,A ;保存结果 SJMP $ END,练习:1. 将30H单元内的两位BCD码拆开并转换成ASCII码,存入RAM 31H和32H 两个单元中。程序流程如图4-1所示。参考程序如下:,LJMP START,下一页,徐医医学影像学院,图4-1 拆字程序流程图,返回,徐医医学影像学院,练习:2. 设X、Y两个小于10的整数分别存于片内30H、31H单元,试求两数的平方和并将结果存于32H单元。,分析:两数均小于10,故两数的平方和小于200,平方和为单字节数。程序流程如图4-2所示。,徐医医学影像学院,图4-2 例4.2程序流程图

15、,徐医医学影像学院,ORG 1000H ST: MOV A,30H ;取30H单元数据MOV DPTR,#TAB ;将X送入B寄存器MOVC A, A+DPTR ;求X2,结果在A中MOV R1,A ;将结果暂存于R1寄存器MOV A,31H ;取31H单元数据MOVC A, A+DPTR ;求Y2,结果在A中ADD A,R1 ;求X2+ Y2MOV 32H,A ;保存数据ret END,思考题:该程序能否求出X2+ Y2 ?,Org 2000h TAB:db 00h,01h,04hdb 09h,10h,19hdb 36,49,64,81,徐医医学影像学院,4.3.2 分支程序,1分支程序的基

16、本形式 分支程序有三种基本形式,如图4-3所示。,分支程序的设计要点如下:,(1)先建立可供条件转移指令测试的条件。,(2)选用合适的条件转移指令。,(3)在转移的目的地址处设定标号。,下一页,徐医医学影像学院,N,(a),(b),(c),图4-3 分支程序结构流程图,返回,徐医医学影像学院,例4.3.4 求出Y值,将Y值存入30H单元。 X X0 Y = 20H X=0 X+5 X0,分析:根据数据的符号位判别该数的正负,若最高位为0,再判别该数是否为0。程序流程如图4-4所示。,2双向分支程序设计举例,徐医医学影像学院,A为负数?,Y,取数,A(30H),开始,结束,A=0?,Y,N,N,

17、AX+5,A#20H,AX,(30H)A,图4-4 程序流程图,徐医医学影像学院,ORG 1000HMOV A, 30H ;取数JB ACC.7,NEG ;负数,转NEG JZ ZER0 ;为零,转ZER0 AJMP SAVE ;为正数转到SAVE,保存数据 ZER0:MOV A,# 20H ;数据为零,Y=(20H )AJMP SAVE ;转到SAVE,保存数据 NEG: ADD A, #5 ;求Y=X+5 SAVE:MOV 30H,A ;保存数据SJMP $ ;暂停,参考程序如下:,徐医医学影像学院,3多向分支程序设计举例,例4.3.5 根据R0的值转向7个分支程序。R0=0,转向SUB0

18、;R0=1,转向SUB1;.R0=N,转向SUBN。,分析:利用JMP A+DPTR 指令直接给PC赋值,使程序实现转移。程序流程如图4-5所示。,徐医医学影像学院,图4-5 多向分支程序流程图,结束,徐医医学影像学院,参考程序如下:ORG 2000H START:MOV DPTR,#TAB ;转移指令表首地址MOV A,R0 ;取数 RL A ;A2(A)JNC A1INC DPH A1 : JMP A+DPTR ;PC A+DPTR TAB: AJMP SUB0 ;转移指令表AJMP SUB1 AJMP SUB2 AJMP SUB3AJMP SUB4 AJMP SUBN,返回,徐医医学影像

19、学院,4.3.4 循环程序,1循环程序的结构(如图4-6所示) 循环程序一般包括如下四个部分: (1)初始化 (2)循环体 (3)循环控制 (4)结束 循环程序按结构形式,有单重循环与多重循环。 在多重循环中,只允许外重循环嵌套内重循环。 不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部(如图4-7 C图所示)。,下一页,徐医医学影像学院,(1) 初始化部分: 为循环程序做准备, 如规定循环次数、 给各变量和地址指针预置初值。 (2) 处理部分: 循环体,为反复执行的程序段, 是循环程序的实体, 也是循环程序的主体。 (3) 循环控制部分: 这部分的作用是修改循环变量和控制变量,

20、 并判断循环是否结束, 直到符合结束条件时, 跳出循环为止。 (4) 结束部分: 这部分主要是对循环程序的结果进行分析、 处理和存放。,返回,徐医医学影像学院,图4-6 循环结构程序流程图,返回,徐医医学影像学院,图4-7 多重循环示意图,返回,徐医医学影像学院,2循环程序设计举例,(1) 数据传送,(2) 算术运算,(3) 软件定时,返回,徐医医学影像学院,例4.3.6 编程实现将内部RAM 20H开始的连续的10个单元清零。,ORG 0100H CLEAR: MOV R2, #10MOV R0, #20HCLR A,;初始化部分,LOOP: MOV R0, A,INC R0DJNZ R2,

21、 LOOP,SJMP $,;执行清零操作,;修改地址指针,;判断循环是否结束?,徐医医学影像学院,例4.3.7 编程实现将内部RAM 起始地址为data的数据串传送到外部RAM中起始地址为BUF的存储区内,直到发现“$”字符,则停止传送。,分析:此例中没有明确循环次数,但知道循环结束条件,即遇到“$”字符时,循环停止。,那么,如何判断字符“$”?,CJNE A, #24H(或$), LOOP1,(A)= #24H?不相等,转LOOP1相等,执行下条指令,徐医医学影像学院,MOV R0, #dataMOV DPTR, #BUF,LOOP0: MOV A, R0CJNE A, #24H, LOOP

22、1SJMP DONE,LOOP1: MOVX DPTR, AINC R0INC DPTRSJMP LOOP0,DONE: END,;初始化部分,;取数,;判断是否为$,;是$,结束,;不是$,传送,;修改指针,;取下一数,;结束,返回,徐医医学影像学院,例4.3.8 单字节求和。设在内部RAM 20H单元开始存有10个单字节无符号数,求其和,存于内部RAM 30H(低位),31H单元(高位)。,MOV R0, #20H MOV R2, #10 CLR A MOV 31H, A,;初始化部分,LOOP: ADD A, R0JNC NEXTINC 31H,NEXT: INC R0DJNZ R2,

23、LOOPMOV 30H, ASJMP $,;求和,;没有进位,准备下一数,;有进位,31H加1,;修改指针 ;10个数加完否,未完,回LOOP ;加完,存低位和到30H,徐医医学影像学院,例4.3.9 多字节无符号数求和。(练习)设两个10字节的无符号数存于内部RAM 中以DATA1和DATA2开始的单元中,相加后结果存放在DATA2数据区。,MOV R0, #DATA1 MOV R1, #DTTA2 MOV R7, #10 CLR C,LOOP: MOV A, R0,ADDC A, R1,MOV R1, A,INC R0 INC R1,DJNZ R7,LOOP,SJMP $,;初始化,;求和

24、,;存结果,;修改指针,;判断循环是否结束,返回,徐医医学影像学院,例4.3.10 50 ms延时程序。,延时程序与 MCS - 51 执行指令的时间有关, 如果使用 12MHz晶振, 一个机器周期为 1 s, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能达到延时的目的。,DEL: MOV R7,#200DEL1: MOV R6,#125DEL2: DJNZ R6,DEL2 ;125*2=250sDJNZ R7,DEL1 ;0.25ms*200=50msRET以上延时程序不太精确,它没有考虑到除“DJNZ R6,DEL2 ”指令外的其它指令的执行时间,它指令的执行时

25、间计算在内,它的延时时间为:(250+1+2)*200+1=50.301ms,徐医医学影像学院,如果要求比较精确的延时,可按如下修改:,DELAY : MOV R7, 200 DEL1: MOV R6, 123NOP DEL2: DJNZ R6, DEL2 DJNZ R7, DEL1 RET ,;1 s ;1 s ;1 s ;2 s ;2s,T=1+(2123+1+1)+2 200=50.001 s,徐医医学影像学院,4.3.4 子程序的设计及其调用,1子程序概念通常把这些基本操作功能编制为程序段作为独立的子程序, 以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令

26、, 当程序执行到调用指令, 就转到子程序中完成规定的操作, 并返回到原来的程序继续执行下去。如图4-8所示。,2. 子程序的调用,所谓调用子程序,暂时中断主程序的执行,而转到子程序的入口地址去执行子程序。,徐医医学影像学院,调用子程序应注意: (1)子程序占用的存储单元和寄存器。 (2)参数的传递。 (3)保护现场和恢复现场。 (4)嵌套调用。如图4-9所示。,调用子程序的指令有“ACALL”和“LCALL”, 执行调用指令时, 先将程序地址指针PC改变(“ACALL”加 2, “LCALL”加 3), 然后 PC值压入堆栈, 用新的地址值代替。执行返回指令时, 再将 PC值弹出。 ,下一页,

27、徐医医学影像学院,图4-8 子程序的调用与返回,返回,徐医医学影像学院,图4-9 子程序的嵌套调用与返回,子程序A,子程序B,返回,徐医医学影像学院,保护现场和恢复现场:子程序执行过程中,常常要用到一些通用单元,如R0R7,A,DPTR,PSW等。,保护现场:子程序要用到这些单元,因此把主程序中这些单元内容保存起来,通常用压栈操作。,恢复现场:执行完子程序返回主程序后,要恢复这些单元内容,通常用出栈操作。,返回,徐医医学影像学院,2子程序设计举例,例4.3.11 编程实现F=X2 +Y2,设F,X,Y分别存于内部RAM的DTA,DTB,DTC单元中。,DTA EQU 30H DTB EQU 3

28、1H DTC EQU 32H,程序清单:,ORG 0100H,START: MOV A, DTA,ACALL SQR,MOV R1, A,;求X平方,;暂存于R1,徐医医学影像学院,MOV DTC,A,MOV A, DTB,ACALL SQR,ADD A, R1,SJMP $,SQR: MOV DPTR, #TAB,MOVC A, A+DPTR,RET,TAB: DB 0,1,4,9,16,25,36,49,64,81,END,ORG 1000H,;求Y平方,;求平方和,;存入DTC单元,;查表子程序,徐医医学影像学院,在这种方式中,要把所要传送的参数存放在累加器A或工作寄存器R0R7中。这就

29、要在调用子程序之前,在主程序中将子程序所需要的参数送入累加器A或指定的工作寄存器中。而在子程序执行时,将参数从指定单元中取出,执行运算;子程序结束时,再用同样方法将结果传送回主程序。,徐医医学影像学院,当传送量比较大时,可以利用存储器实现参数的传递。在这种方式中,事先建立一个参数表,用指针指示参数表所在位置。,当参数表建立在内部RAM时,用R0或R1做地址指针;当参数表建立在外部RAM时,用DPTR做地址指针。,徐医医学影像学院,例4-3-12 将R0和R1指向的内部RAM 中两个3字节无符号整数相加,结果送到由R0指向的内部RAM中。入口时,R0和R1分别指向加数和被加数的低位字节;出口时,

30、R0指向结果的高位字节。低字节在高地址,高字节在低地址。,徐医医学影像学院,ORG 0100HNADD:MOV R7,#3 ;三字节加法CLR C ; NADD1:MOV A,R0 ;取加数低字节ADDC A,R1 ;被加数低字节加AMOV R0,A ;DEC R0DEC R1DJNZ R7,NADD1RET,徐医医学影像学院,栈传递参数是在子程序嵌套中常采用的一种方法。在调用子程序前,用PUSH指令将参数压入堆栈,执行子程序时用POP指令弹出参数。,徐医医学影像学院,一般说来:数据较少时,采用寄存器传递方式可以获得较快的传递速度;数据较多时,宜采用存储器或堆栈方式传递;若是子程序嵌套,宜采用堆栈方式。,徐医医学影像学院,本章小结,了解机器语言、汇编语言和高级语言的区别,掌握源程序、伪指令等基本概念 熟练应用几款汇编语言程序编程及开发环境 掌握简单的程序设计与编程,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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