《单片机汇编程序设计.ppt》由会员分享,可在线阅读,更多相关《单片机汇编程序设计.ppt(69页珍藏版)》请在第壹文秘上搜索。
1、第第4章章 汇编语言程序设计简介汇编语言程序设计简介 4.1 伪指令伪指令 4.2 汇编语言程序设计汇编语言程序设计 4.1 伪伪 指指 令令 伪指令伪指令 是是 对汇编过程对汇编过程 起控制作用,但本起控制作用,但本身并没有对应的机器代码的指令。身并没有对应的机器代码的指令。 一、一、 汇编起始指令汇编起始指令 ORG 指令格式为指令格式为: ORG nn 该指令的作用是指明后面的程序或数据块的起始地址该指令的作用是指明后面的程序或数据块的起始地址, 它总是出现在每段源程序或数据块的开始。它总是出现在每段源程序或数据块的开始。 式中式中, nn为为 16 位地址位地址, 汇编时汇编时nn确定
2、了此语句后面第一条指令或第一个数确定了此语句后面第一条指令或第一个数据的地址据的地址,此后的源程序或数据块就依次连续存放在以后的地此后的源程序或数据块就依次连续存放在以后的地址内址内, 直到遇到另一个直到遇到另一个ORG指指令为止。令为止。 例例: ORG 2000H MOV SP, 60H MOV R0, 2FH MOV R2, 0FFH ORG伪指令说明其后面程序的目标代码在存储器中存放的伪指令说明其后面程序的目标代码在存储器中存放的起始地址是起始地址是2000H, 即即 存储器地址存储器地址 目标程序目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF
3、二、等值指令二、等值指令EQU 指令格式指令格式: 字符名称字符名称 EQU 数字或汇编符号数字或汇编符号 例例: PA8155 EQU 8001H ;即给标号即给标号PA8155赋值为赋值为8001H。 功能功能: 使指令中的字符名称等价于给定的数字或汇编符号。使指令中的字符名称等价于给定的数字或汇编符号。 使用等值指令可给程序的编制、调试、修改带来方便使用等值指令可给程序的编制、调试、修改带来方便, 如果如果在程序中要多次使用到某一地址在程序中要多次使用到某一地址,由由EQU指令将其赋值给一个指令将其赋值给一个字符名称字符名称, 一旦需要对其进行变动一旦需要对其进行变动, 只要改变只要改变
4、EQU命令后面的数命令后面的数字即可字即可, 而不需要对程序中涉及到该地址的所有指令逐句进行而不需要对程序中涉及到该地址的所有指令逐句进行修改。修改。 但要注意但要注意, 由由 EQU等值的字符名称必须先赋值后使用等值的字符名称必须先赋值后使用, 且在同一个源程序中且在同一个源程序中, 同一个标号只能赋值一次。同一个标号只能赋值一次。 三、三、 定义字节指令定义字节指令DB 指令格式指令格式: 标号标号: DB 8位二进制数表位二进制数表 功能功能: 把把 8 位二进制数表依次存入从标号开始的连续的位二进制数表依次存入从标号开始的连续的存储单元中。存储单元中。 格式中格式中, 标号区段可有可无
5、标号区段可有可无, DB指令之后的指令之后的 8 位二进制位二进制数表是字节常数或用逗号隔开的字节串数表是字节常数或用逗号隔开的字节串, 也可以是用引号括也可以是用引号括起来的起来的ASCII码字符串码字符串 (一个一个 ASCII字符相当于一个字节字符相当于一个字节)。 例例: ORG 1000HBUF1: DB 38H, 7FH, 80HBUF2: DB 45H, 66H ORG伪指令指定了标号伪指令指定了标号BUF1的地址为的地址为1000H, 而而DB伪指令是将其后的二进制数表伪指令是将其后的二进制数表38H, 7FH, 80H依次存放在依次存放在1000H, 1001H, 1002H
6、 3 个连续单元之个连续单元之中中, BUF2也是一个标也是一个标号号, 其地址与前一条伪指令连其地址与前一条伪指令连续续, 即即1003H, 1004H地址单元中依次存放地址单元中依次存放 45H, 66H。 四、四、 定义字指令定义字指令DW 指令格式指令格式: 标号标号: DW 16 位数据表位数据表 该指令的功能与该指令的功能与DB相似相似, 区别仅在于从指定地区别仅在于从指定地址开始存放的是指令中的址开始存放的是指令中的 16 位数据位数据, 而不是字节串。而不是字节串。每个每个 16 位数据要占两个存储单元位数据要占两个存储单元, 高高8 位先存位先存, 低低 8 位后存位后存,
7、这和这和MCS -51指令中的指令中的16位数据存放顺序是位数据存放顺序是一致的。一致的。 五、五、 汇编结束指令汇编结束指令END 指令格式指令格式: 标号标号: END 地址或标号地址或标号 格式中标号以及格式中标号以及END后面的地址或标号可有可无。后面的地址或标号可有可无。 功能功能: 提供汇编结束标志。汇编程序遇到提供汇编结束标志。汇编程序遇到 END后就后就停止汇编停止汇编, 对对 END以后的语句以后的语句不予处理不予处理, 故故 END应放在应放在程序的结束处。程序的结束处。 4.2 汇编语言程序设计汇编语言程序设计 4.2.1 简单程序设计简单程序设计 例例 1 两个无符号双
8、字节数相加。两个无符号双字节数相加。 设被加数存放于内部设被加数存放于内部RAM的的40H(高位字节)(高位字节), 41H(低位字节)(低位字节), 加数存放加数存放于于50H(高位字节)(高位字节), 51H(低位字节)(低位字节), 和数存入和数存入 40H和和41H单元中。单元中。 程序如下: START: CLR C ; 将将Cy清零清零 MOV R0, 41H ; 将被加数地址送数据指针将被加数地址送数据指针R0 MOV R1, 51H ; 将加数地址送数据指针将加数地址送数据指针R1 AD1: MOV A, R0 ; 被加数低字节的内容送入被加数低字节的内容送入AADD A,R1
9、 ; 两个低字节相加两个低字节相加MOV R0, A ; 低字节的和存入被加数低字节中低字节的和存入被加数低字节中 DEC R0 ; 指向被加数高位字节指向被加数高位字节 DEC R1 ; 指向加数高位字节指向加数高位字节 MOV A, R0 ; 被加数高位字节送入被加数高位字节送入AADDC A, R1 ; 两个高位字节带两个高位字节带Cy相加相加 MOV R0, A ; 高位字节的和送被加数高位字节高位字节的和送被加数高位字节 RET 例例 2 将两个半字节数合并成一个一字节数。将两个半字节数合并成一个一字节数。 设内部设内部RAM 40H#, 41H单元中分别存放着单元中分别存放着 8
10、位二进制位二进制数数, 要求取出两个单元中的低半字节要求取出两个单元中的低半字节, 并成一个字节后并成一个字节后, 存入存入 50H单元中。单元中。 程序如下程序如下: START: MOV R1, 40H ; 设置设置R1为数据指针为数据指针MOV A, R1 ; 取出第一个单元中的内容取出第一个单元中的内容ANL A, 0FH ; 取第一个数的低半字节取第一个数的低半字节SWAP A ; 移至高半字节移至高半字节INC R1 ; 修改数据指针修改数据指针MOV A, R1 ; 取第二个单元中的内容取第二个单元中的内容ANL A, 0FH ; 取第二个数的低半字节取第二个数的低半字节ORL
11、A, R1 ; 拼字拼字MOV 50H, A ; 存放结果存放结果RET 4.2.2 分支程序设计分支程序设计 图图 4.1 分支结构框图分支结构框图(a) 单分支流程单分支流程; (b) 多分支流程多分支流程 例例 3 x, y均为均为8位二进制数位二进制数, 设设 x存入存入R0, y存入存入R1, 求解求解: y=syn(x)程序如下程序如下: START: CJNE R0, 00H, SUL1 ; R0中的数与中的数与00比较不等转移比较不等转移 MOV R1, 00H; 相等相等, R1 0 SJMP SUL2 SUL1: JC NEG ; 两数不等两数不等, 若(若(R0)0, 则
12、则 R101H SJMP SUL2 NEG : MOV R1, 0FFH ; (R0)0, 则则 R10FFH SUL2 : RET 正确程序如下正确程序如下: SUBF : MOV A,R0 JZ ZERO JB ACC.7 , NEG MOV R1, #1 ZERO : MOV R1 , #0 SJMP ENDF NEG : MOV R1 , #0FFH ENDF : RET 例例 4 比较两个无符号数的大小。比较两个无符号数的大小。 设外部设外部 RAM 的存储单元的存储单元 ST1和和 ST2中存放两个不带符号的二进制数中存放两个不带符号的二进制数, 找出其中找出其中的大数存入外部的大
13、数存入外部 RAM 中的中的 ST3单元中。单元中。 图 4.3 程序如下:程序如下: 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 BIG2 ; 若第二个数大若第二个数大,
14、则转则转XCH A, R2; 第一个数大第一个数大BIG1: MOV DPTR, ST3 MOVX DPTR, A ; 存大数存大数RETBIG2: MOVX A, DPTR; 第二个数大第二个数大SJMP BIG1RET 4.2.3 循环程序设计循环程序设计 一、一、 循环程序循环程序 图 4.4 循环程序一般由四个主要部分组成循环程序一般由四个主要部分组成: (1) 初始化部分初始化部分: 为循环程序做准备为循环程序做准备, 如规定循环次数、如规定循环次数、 给给各变量和地址指针预置初值。各变量和地址指针预置初值。 (2) 处理部分处理部分: 为反复执行的程序段为反复执行的程序段, 是循环
15、程序的实体是循环程序的实体, 也也是循环程序的主体。是循环程序的主体。 (3) 循环控制部分循环控制部分: 这部分的作用是修改循环变量和控制变这部分的作用是修改循环变量和控制变量量, 并判断循环是否结束并判断循环是否结束, 直到符合结束条件时直到符合结束条件时, 跳出循环为止。跳出循环为止。 (4) 结束部分结束部分: 这部分主要是对循环程序的结果进行分析、这部分主要是对循环程序的结果进行分析、 处理和存放。处理和存放。 例例 5 工作单元清零。工作单元清零。 在应用系统程序设计时在应用系统程序设计时, 有时经常需要将存储器中各部有时经常需要将存储器中各部分地址单元作为工作单元分地址单元作为工
16、作单元, 存放程序执行的中间值或执行结存放程序执行的中间值或执行结果果, 工作单元清零工作常常放在程序的初始化部分中。工作单元清零工作常常放在程序的初始化部分中。 设有设有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 40HSTART: CLR A ; 清累加器清累加器A MOV R2,