820 likes | 1.09k Views
第四章 汇编语言程序设计. 第四章 汇编语言程序设计. 4.1 计算机语言概述. 4.2 汇编语言源程序设计与汇编. 4.3 汇编语言程序设计. 4.4 实用程序举例. 实 验. 习题与思考题. 第四章 汇编语言程序设计. 4.1.1 机器语言 机器语言就是用二进制编码表示每条指令。因为计算机只能识别二进制数,所以计算机能够直接执行用机器语言编出的机器码程序。不同种类的计算机,由于其内部结构不完全相同,它的机器码指令也不一定相同。. 第四章 汇编语言程序设计. 4.1.2 汇编语言
E N D
第四章 汇编语言程序设计 第四章 汇编语言程序设计 4.1 计算机语言概述 4.2 汇编语言源程序设计与汇编 4.3 汇编语言程序设计 4.4 实用程序举例 实 验 习题与思考题
第四章 汇编语言程序设计 4.1.1 机器语言 机器语言就是用二进制编码表示每条指令。因为计算机只能识别二进制数,所以计算机能够直接执行用机器语言编出的机器码程序。不同种类的计算机,由于其内部结构不完全相同,它的机器码指令也不一定相同。
第四章 汇编语言程序设计 4.1.2 汇编语言 汇编语言是符号化的机器语言。它用一些容易理解和记忆的符号代替机器码指令,因此又把汇编语言称为助记符语言,也就是说助记符指令与机器码指令是一一对应的。汇编语言同机器语言一样,不同结构的计算机,它的汇编指令也不相同。上述“9+5”的例子用AT89C51汇编语言可写成: MOV A,#09H ADD A,#05H
第四章 汇编语言程序设计 对比机器码,汇编语言克服了机器语言的缺点,方便了用户记忆指令和编写程序,但用汇编语言编写的源程序毕竟不是计算机能直接识别的机器码,需用汇编程序“翻译”成机器码后方可执行。 采用汇编语言编写程序,可以直接访问和操作单片机中的寄存器及存储器单元,对数据的处理表述的非常具体。因此,在计算机实时测试和控制领域中得到了广泛应用。
第四章 汇编语言程序设计 4.1.3 高级语言 高级语言是接近自然语言和数学语言的算法语言,具有直观、通用等特点。相对于高级语言,机器语言和汇编语言属于低级语言。用低级语言编写程序需要完全了解CPU硬件结构,对程序设计人员要求较高,且程序不能移植。
第四章 汇编语言程序设计 4.2 汇编语言源程序的设计与汇编 4.2.1 汇编语言格式 汇编语言源程序是由汇编语句(即指令)组成的。汇编语言一般由四部分组成。 其典型的汇编语句格式如下: 标号: 操作码 操作数 ;注释 START:MOV A,30H ;A←(30H)
第四章 汇编语言程序设计 [例4.1] 将30H、31H两个单元中的大数送入A中。 MOV A,30H CJNE A,31H,BIG BIG:JNC OVER;30H单元值大则结束 MOV A,31H;31H单元值小则送入累加器A中 OVER:RET
第四章 汇编语言程序设计 ● 标号是语句地址的标记符号,用于引导对该语句的访问。只有程序中非顺序访问该语句时,才加注标号。有关标号规定如下: ①标号由不多于8个ASCll字符组成,第一个字符必须是字母; ②同一标号在一个独立的程序中只能定义一次; ③不能使用汇编语言中已定义的符号,如指令助记符、寄存器名、伪指令记忆符等。 ● 操作码指出了指令要实现的操作功能。 ●操作数是该语句操作时所需要的数据或地址。 ●注释部分仅用于对语句的说明,帮助程序人员阅读、理解程序。
第四章 汇编语言程序设计 4.2.2 程序设计步骤 1.分析问题,确定算法 这是程序设计中最重要的一步。设计人员必须认真、仔细地考虑系统需要解决的各种问题以及将来系统功能的进一步扩展,明确知道程序要解决的问题和接收、处理、发送的数据范围以及使用什么样的算法。
第四章 汇编语言程序设计 2.画流程图 流程图是用各种图形、符号、有向线段来直观地表示程序执行的步骤和顺序。它可使人们通过流程图的基本线索,对全局有完整的了解。
第四章 汇编语言程序设计 3.编写源程序代码 根据流程图用汇编语言指令实现流程图的每一个步骤,从而编写出汇编语言的源程序。 4.调试、测试程序 调试是利用仿真器等开发工具,采用单步、设断点、连续运行等方法排除程序中的错误,完善程序的功能。
第四章 汇编语言程序设计 汇编 源程序 (汇编语言) 目标码 (机器语言) 反汇编 汇编与反汇编示意图 4.2.3 源程序汇编 1、手工汇编:通过手工的方式查指令编码表,逐个把助记符指令“翻译”成机器码的过程。 2、 机器汇编:是在机器上使用汇编程序自动地进行源程序的汇编,最后得到机器码表示的目标程序。
第四章 汇编语言程序设计 4.2.4 伪指令 1、 汇编起始指令 ORG 指令格式为: ORG nn 该指令的作用是指明后面的程序或数据块的起始地址, 它总是出现在每段源程序或数据块的开始。 式中, nn为 16 位地址, 汇编时nn确定了此语句后面第一条指令或第一个数据的地址,此后的源程序或数据块就依次连续存放在以后的地址内, 直到遇到另一个ORG指令为止。
第四章 汇编语言程序设计 例: ORG 2000H MOV SP, #60H MOV R0, #2FH MOV R2, # 0FFH ORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是2000H, 即 存储器地址 目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF
第四章 汇编语言程序设计 2、 汇编结束指令END 指令格式: [标号:] END 地址或标号 格式中标号以及END后面的地址或标号可有可无。 功能: 提供汇编结束标志。汇编程序遇到 END后就停止汇编, 对 END以后的语句不予处理, 故 END应放在程序的结束处。
第四章 汇编语言程序设计 3、等值指令EQU 指令格式: 字符名称 EQU 数字或汇编符号 功能: 使指令中的字符名称等价于给定的数字或汇编符号。 使用等值指令可给程序的编制、调试、修改带来方便, 如果在程序中要多次使用到某一地址,由EQU指令将其赋值给一个字符名称, 一旦需要对其进行变动, 只要改变EQU命令后面的数字即可, 而不需要对程序中涉及到该地址的所有指令逐句进行修改。 但要注意, 由 EQU等值的字符名称必须先赋值后使用, 且在同一个源程序中, 同一个标号只能赋值一次。 例: PA8155 EQU 8001H 即给标号PA8155赋值为8001H。
第四章 汇编语言程序设计 4、DATA数值地址赋值伪指令 指令格式: 字符名称 DATA 表达式 功能:DATA 与EQU 基本相同,即将DATA右边表达式的值赋给一个字符名称。二者的区别是:EQU必须先定义,后使用;而DATA可先使用后定义。 5、 BIT 位地址赋值伪指令 指令格式: 字符名 BIT 位地址 功能:将位地址赋予给字符名。 例: M1 BIT 01H M2 BIT P1.0 汇编后,01H和P1.0的位地址90H分别赋给了M1和M2。
第四章 汇编语言程序设计 6、 定义字指令DW 指令格式: [标号:] DW 16 位数据表 该指令的功能与DB相似, 区别仅在于从指定地址开始存放的是指令中的 16 位数据, 而不是字节串。每个 16 位数据要占两个存储单元, 高8 位先存, 低 8 位后存, 这和MCS -51指令中的16位数据存放顺序是一致的。
第四章 汇编语言程序设计 7、 定义字节指令DB 指令格式: [标号: ] DB 8位二进制数表 功能: 把 8 位二进制数表依次存入从标号开始的连续的存储单元中。 格式中, 标号区段可有可无, DB指令之后的 8 位二进制数表是字节常数或用逗号隔开的字节串, 也可以是用引号括起来的ASCII码字符串 (一个 ASCII字符相当于一个字节)。 例:
第四章 汇编语言程序设计 • ORG 1000H • BUF1: DB 38H, 7FH, 80H • BUF2: DB 45H, 66H • ORG伪指令指定了标号BUF1的地址为1000H, 而DB伪指令是将其后的二进制数表38H, 7FH, 80H依次存放在1000H, 1001H, 1002H 3 个连续单元之中, BUF2也是一个标号, 其地址与前一条伪指令连续, 即1003H, 1004H地址单元中依次存放 45H, 66H。
第四章 汇编语言程序设计 8、DS 预留存储区伪指令 格式: 标号: DS 表达式 功能:从标号指定单元开始,定义了一个大小为表达式的值的存储区,以备后用。 例:ORG 3000H DS 09H DB 10H,20H 汇编后,从3000H 单元开始保留9个单元,然后从3009H按DB命令给内存单元赋值,即 (3009H)=10H ,(300AH)=20H
第四章 汇编语言程序设计 4.3 汇编语言程序设计 4.3.1 顺序程序设计 顺序程序是一种最简单,最基本的程序。 特点:程序按编写的顺序依次往下执行每一条指令,直到最后一条。 【例4.1】 将30H单元内的两位BCD码拆开并转换成ASCII码,存入RAM两个单元中。程序流程如图4-1所示。参考程序如下: ORG 2000H 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位(原来的高4位) ADD A,#30H ;转换成ASCII码 MOV 31H,A ;保存结果 SJMP $ END
第四章 汇编语言程序设计 开始 取数据低4位 转换成ASCII码 存ASCII码 取数据高4位 转换成ASCII码 存ASCII码 结束 程序流程图
第四章 汇编语言程序设计 【例4.2】 设X、Y两个小于10的整数分别存于片内30H、31H单元,试求两数的平方和并将结果存于32H单元。 解:两数均小于10,故两数的平方和小于100,可利用乘法指令求平方。程序流程如图4-2所示。参考程序如下: ORG 2000H MOV A,30H ;取30H单元数据 MOV B,A ;将X送入B寄存器
第四章 汇编语言程序设计 MUL AB ;求X2,结果在累加器中 MOV R1,A ;将结果暂存于R1寄存器中 MOV A,31H ;取31H单元数据 MOV B,A ;将Y送入B寄存器 MUL AB ;求Y2,结果在累加器中 ADD A,R1 ;求X2+ Y2 MOV 32H,A ;保存数据 SJMP $ ;暂停 END
第四章 汇编语言程序设计 开始 取数据X 求X2 暂存X2 取数据Y 求Y2 求X2+Y2 保存平方和 结束 程序流程图
第四章 汇编语言程序设计 4.3.2 分支程序设计 图 4.1 分支结构框图 (a) 单分支流程; (b) 多分支流程
第四章 汇编语言程序设计 例 3 x#, y均为8位二进制数, 设 x存入R0, y存入R1, 求解: 程序如下: START: CJNE R0, #00H, SUL1; R0中的数与00比较不等转移 MOV R1, #00H; 相等, R1← 0 SJMP SUL2 SUL1: JC NEG ; 两数不等, 若(R0)<0, 转向NEG MOV R1, #01H ; (R0)>0, 则 R1←01H SJMP SUL2 NEG: MOV R1, #0FFH ; (R0)<0, 则 R1←0FFH SUL2: RET
第四章 汇编语言程序设计 例 4比较两个无符号数的大小。 设外部 RAM 的存储单元 ST1和 ST2中存放两个不带符号的二进制数, 找出其中的大数存入外部 RAM 中的 ST3单元中。
第四章 汇编语言程序设计 程序如下: ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START: CLR C ; 清零Cy MOV DPTR, #ST1 ; 第一个数的指针 MOVX A, @DPTR ; 取第一个数 MOV R2, A ; 保存 MOV DPTR, #ST2 ; 第二个数的指针 MOVX A, @DPTR ; 取第二个数 CLR C
第四章 汇编语言程序设计 • SUBB A, R2; 两数比较 • JNC BIG1 ; 若第二个数大, 则转 • XCH A, R2; 第一个数大 • BIG0: MOV DPTR, #ST3 • MOVX @DPTR, A ; 存大数 • RET • BIG1: MOVX A, @DPTR; 第二个数大 • SJMP BIG0 • RET
第四章 汇编语言程序设计 4.3.3 循环程序设计
第四章 汇编语言程序设计 循环程序一般由四个主要部分组成: (1) 初始化部分: 为循环程序做准备, 如规定循环次数、 给各变量和地址指针预置初值。 (2) 处理部分: 为反复执行的程序段, 是循环程序的实体, 也是循环程序的主体。 (3) 循环控制部分: 这部分的作用是修改循环变量和控制变量, 并判断循环是否结束, 直到符合结束条件时, 跳出循环为止。 (4) 结束部分: 这部分主要是对循环程序的结果进行分析、 处理和存放。
第四章 汇编语言程序设计 例 5 工作单元清零。 在应用系统程序设计时, 有时经常需要将存储器中各部分地址单元作为工作单元, 存放程序执行的中间值或执行结果, 工作单元清零工作常常放在程序的初始化部分中。 设有50个工作单元, 其首址为外部存储器8000H单元, 则其工作单元清零程序如下:
第四章 汇编语言程序设计 CLEAR: CLR A MOV DPTR, #8000H ; 工作单元首址送指针 MOV R2, 50 ; 置循环次数 CLEAR1: MOVX @DPTR, A INC DPTR ; 修改指针 DJNZ R2, CLEAR1; 控制循环 RET
第四章 汇编语言程序设计 例 6 设在内部 RAM的BLOCK单元开始处有长度为 LEN个的无符号数据块, 试编一个求和程序, 并将和存入内部 RAM的 SUM单元(设和不超过 8 位)。 • BLOCK EQU 20H • LENEQU 30H • SUM EQU 40H • START: CLR A ; 清累加器A • MOV R2, #LEN; 数据块长度送R2 • MOV R1, #BLOCK ; 数据块首址送R1 • LOOP: ADD A, @R1 ; 循环加法 • INC R1; 修改地址指针 • DJNZ R2, LOOP ; 修改计数器并判断 • MOV SUM, A; 存和 • RET
第四章 汇编语言程序设计 • 例 7 10 秒延时程序。 • 延时程序与 MCS - 51 执行指令的时间有关, 如果使用 6 MHz晶振, 一个机器周期为 2 μs, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能达到延时的目的。10 秒延时程序如下: • DELAY: MOV R5, #100 • DEL0: MOV R6, #200 • DEL1: MOV R7, #248 • DEL2: DJNZ R7, DEL2 • DJNZ R6, DEL1 • DJNZ R5, DEL0 • RET
第四章 汇编语言程序设计 上例程序中采用了多重循环程序, 即在一个循环体中又包含了其它的循环程序, 这种方式是实现延时程序的常用方法。 使用多重循环时, 必须注意: (1) 循环嵌套, 必须层次分明, 不允许产生内外层循环交叉。 (2) 外循环可以一层层向内循环进入, 结束时由里往外一层层退出。 (3) 内循环可以直接转入外循环, 实现一个循环由多个条件控制的循环结构方式。
第四章 汇编语言程序设计 例 8 在外部 RAM中, BLOCK开始的单元中有一无符号数据块, 其个数为 LEN个字节。试将这些无符号数按递减次序重新排列, 并存入原存储区。 ORG 1000H START: MOV DPTR, #BLOCK; 置地址指针 MOV P2, DPH ; P2作地址指针高字节 MOV R7, #LEN ; 置外循环计数初值 DEC R7 ; 比较与交换 n-1次
第四章 汇编语言程序设计 LOOP0: CLR F0 ; 交换标志清 0 MOV R0, DPL; MOV R1, DPL ; 置相邻两数地址指针低字节 INC R1 MOV R6, R7 ; 置内循环计数器初值 LOOP1: MOVX A, @R0 ; 取数 MOV B, A ; 暂存 MOVX A, @R1 ; 取下一个数 CJNE A, B, NEXT; 相邻两数比较, 不等转 SJMP NOCHA ; 相等不交换
第四章 汇编语言程序设计 NEXT: JC NOCHA; Cy =1, 则前者大于后者, 不必交换 SETB F0 ; 否则, 置交换标志 MOVX @R0, A ; XCH A, B ; 两数交换, 大者在前, 小者在后 MOVX @R1, A ; NOCHA: INC R0 INC R1; 修改指针 DJNZ R6, LOOP1 ; 内循环未完, 则继续 JNB F0, EXIT ; 若从未交换, 则结束 DJNZ R7, LOOP0; 外循环未完, 则继续 EXIT: RET
第四章 汇编语言程序设计 4.3.4 子程序设计 1.子程序概念 所谓调用子程序,暂时中断主程序的执行,而转到子程序的入口地址去执行子程序。如图所示。 调用子程序应注意: (1)子程序占用的存储单元和寄存器。 (2)参数的传递。 (3)子程序经过调用后得到的数据来完成程序之间的参数传递。 (4)嵌套调用与递归调用。如图所示。
第四章 汇编语言程序设计 图4-10 子程序的调用与返回 LCALL SUB RET
第四章 汇编语言程序设计 图4-11 子程序的嵌套调用与返回 LCALL A LCALL B RET RET
第四章 汇编语言程序设计 2.子程序设计举例 【例】 将4.4节中的例4.5改为子程序结构。 解:数据块中的十个数都需要进行符号判断并作相应处理,可把一部分工作交给子程序完成,主程序只负责读取数据、调用判断处理子程序、保存数据、循环控制工作。源程序如下: ORG 0000H MOV R0,#10 MOV R1,#30H
第四章 汇编语言程序设计 START: MOV A,@R1 ;取数 ACALL DISPOSE ;调用判断、处理子程序 SAVE: MOV @R1,A ;保存数据 INC R1 ;修改地址指针,指向下一个地址 DJNZ R0,START ;数据未处理完,继续处理 SJMP $ ;暂停 ORG 0200H DISPOSE:JB ACC.7,NEG;若为负数,转NEG
第四章 汇编语言程序设计 JZ ZER0 ;若为零,转ZER0 ADD A,#02H ;若为正数,求X+2 AJMP BACK ;转到SAVE,保存数据 ZER0: MOV A,#64H ;数据为零,Y=100 AJMP BACK ;转到SAVE,保存数据 NEG: DEC A CPL A ;求∣X∣ BACK: RET