




已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
算术运算程序设计 汇编语言程序的结构 汇编语言概述 第4章汇编语言程序设计 非数值操作程序设计 第4章汇编语言程序设计 汇编语言是面向机器硬件的语言 要求程序设计者对MCS 51单片机具有很好的 软 硬结合 的功底 1 汇编语言与汇编的概念 1 机器语言 machinelanguage 2 汇编语言 assemblylanguage 由助记符 保留字和伪指令等组成 容易被人们识别 记忆和读写 也称为符号语言或汇编语言 将汇编语言程序转换成为二进制代码表示的机器语言程序称为汇编程序 经汇编程序 汇编 翻译 得到的机器语言程序称为目标程序 原来的汇编语言程序称为源程序 3 高级语言 high levellanguage 2 汇编语言源程序的格式 采用汇编语言编写的程序称为汇编语言源程序 程序不能被计算机直接识别和执行 需人工或机器翻译成机器语言才能被计算机执行 为了使机器能识别和正确汇编 用户在程序设计时必须严格遵循汇编语言格式和语法规则 才能编写符合要求的汇编语言源程序 对MCS 51来说 汇编语言源程序有两种基本类型 指令语句伪指令语句 1 指令语句 告诉CPU如何操作以及做何种操作 CPU指令系统中的指令均为 真 指令 每一条指令语句在汇编时都产生一个指令代码 机器代码 2 伪指令语句 其作用是增加汇编源程序的可读性及在对源程序进行汇编的过程中产生某种控制的汇编控制命令 这类指令不能生成可执行的机器语言 是控制汇编过程的 在汇编时没有机器代码与之对应 3 MCS 51的汇编语言中每条语句典型的四分段格式 标号字段 操作码字段 操作数字段 注释字段规则 1 标号字段和操作字码段之间要有冒号 相隔 2 操作码字段和操作数字段间的分界符是空格 3 双操作数之间用逗号相隔 4 操作数字段和注释字段之间的分界符用分号 相隔 操作码字段为必选项 其余各段为任选项 3 MCS 51的汇编语言中每条语句典型的四分段格式 例 ORG0080HSTART MOVA 00H 0 AMOVR1 0AH 10 R1MOVR2 00000011B 3 R2LOOP ADDA R2 A R2 ADJNZR1 LOOP R1内容减1不为零 则循环NOPHERE SJMPHEREEND 程序共由9条语句组成 第1 9两条是指示性语句 伪指令 其余为指令性语句 第2 5两条是四分段齐全的语句 第3 4 6 7等四条是缺省标号段的语句 第7 9两条只有操作码字段 4 基本语法规则 1 标号字段位于一条语句的开头 是语句所在内存单元地址的标志符号 1 标号后边必须跟以冒号 2 由1 8个ASCII字符组成 3 同一标号在一个程序中只能定义一次 4 不能使用汇编语言已经定义的符号作为标号 2 操作码字段是指令的保留字 如上述程序中的MOV ADD和NOP等 也可以是伪指令和宏指令的助记符 如ORG和END 汇编语言指令中唯一不能空缺的部分 汇编程序就是根据这一字段来生成机器代码的 3 操作数字段用于存放指令的操作数或操作数地址 可以采用字母和数字等形式 通常有单操作数 双操作数和无操作数三种情况 如果是双操作数 则操作数之间 要以逗号隔开 1 十六进制 二进制和十进制形式的操作数表示 2 工作寄存器和特殊功能寄存器 可用工作寄存器和特殊功能寄存器的名字来表示 也可用其地址来表示 3 符号 常在转移类指令的操作数字段中使用用于表示该转移指令操作码所在的存储单元地址 4 注释字段 3 伪指令 汇编控制指示性语句又称伪指令 简称伪指令 每种汇编语言都有自己的伪指令 伪指令和指令是完全不同的 伪指令不是真正的指令 是用来对汇编语言过程进行某种控制 或者对符号和标号进行赋值等 也称为汇编程序控制命令 只有在汇编前的源程序中才有伪指令 经过汇编得到目标程序 机器代码 伪指令没有相应的机器代码产生 1 起始地址设定伪指令ORG Origin 起点 格式 ORG16位地址功能 定义此语句后的程序或数据块的起始地址 例 ORG伪指令使用方法说明 单元地址机器码 H 标号指令助记符 注释 DB MCS DB 51 4D435335317850EC26FB 1000H1003H 2000H2002H2003H2004H ORG1000H ORG2000H Start MOVR0 50HMOVA R4ADDA R0MOVR3 A 2 汇编结束伪指令END 格式 END功能 表示汇编程序结束 该指令放在汇编程序的最后 3 赋值伪指令EQU Equate 等值 格式 标号名EQU表达式功能 是指令中的字符名称等价于给定的数字或汇编符号 例 EQU伪指令使用方法说明 单元地址机器码 H 标号指令助记符 注释 注意 使用EQU伪指令给一个标号赋值后 这个标号在整个源程序中的值是固定的 也就是说在一个源程序中 任何一个标号只能用EQU赋值一次 30003002 END LOOP MOVDPTR 2000 90 SU START MOVA 66 74 LOOPEQU2000H SUEQU66H ORG3000H 4 定义字节伪指令DB Difinebyte 定义字节 格式 标号 DB字节常数 字符 表达式功能 把8位二进制字节常数或字节串依次存入内存的连续单元中 字节常数或字符是指一个字节数据 或用逗号分开的字符串 或用引号括起来的ASCII码字符串 例 DB伪指令使用方法说明 ORG9000H9000H730190DATA1DB73H 01H 90H9003H02DATA2DB02H9004H48656C9007H6C6F20DB HelloWorld 900AH576F72900DH6C6421 5 定义字伪指令DW DifineWord 定义字 格式 标号 DW字常数 字串 表达式功能 把16位常数或字串依次存入内存的连续单元中 每个16位数据要占两个存储单元 高8位在前 地址小 低8位在后 地址大 DW主要用来定义地址 例 DW伪指令使用方法说明 ORG3000H3000H00110022XDW0011H 0022H3004H12345678YDW1234H 5678H 6 定义存储单元伪指令DS 格式 标号 DS单元数功能 在内存中预留若干个连续的字节单元 例 DS伪指令使用方法说明 ORG3000H3000H0011XDW0011H3002H YDS23004H DS33007H7412START MOVA 12H3009H END 7 定义位地址伪指令BIT 格式 标号BIT位地址功能 为标号赋予一个位地址 例 BIT伪指令使用方法说明 ORG3000HWEIBITACC 03000HA2E0START MOVC WEI300CH END Acc 0的位地址等于E0H 这里填E0H 8 程序计数器 独立出现 时 其值为程序将要分配的存储器单元的地址 字符 在汇编语言中具有一种特殊的意义 汇编时使用 称为程序计数器 独立出现 时 其值等于汇编时将为程序分配的存储单元的地址 可以在数值表达式中使用 例 常用伪指令回顾 起始地址设定伪指令ORG Origin 起点 汇编结束伪指令END赋值伪指令EQU Equate 等值 定义字节伪指令DB Difinebyt 定义字节 定义字节伪指令DW DifineWord 定义字 定义存储单元伪指令DS定义位地址伪指令BIT DifineBitAddress 定义位地址 程序计数器 4 源程序的汇编 1 手工汇编 汇编语言源程序 翻译 成机器代码 指令代码 的过程称为 汇编 汇编可分为手工汇编和机器汇编两类 人工查表翻译指令 但遇到的相对转移指令的偏移量的计算 要根据转移的目标地址计算偏移量 不但麻烦 且容易出错 两次汇编过程 第一次汇编 指令语句翻译成机器码 标号原样写出 第二次汇编 编排地址 将标号用所计算出的具体地址值或偏移量代换 2 机器汇编 用编辑软件进行源程序的编辑 编辑完成后 生成一个ASCII码文件 扩展名为 ASM 然后在微计算机上运行汇编程序 把汇编语言源程序翻译成机器代码 两次扫描过程 第一次扫描 检查语法错误 确定符号名字 建立使用的全部符号名字表 每一符号名字后跟一对应值 地址或数 第二次扫描 是在第一次扫描基础上 将符号地址转换成地址 代真 利用操作码表将助记符转换成相应的目标码 1 汇编语言程序设计步骤 汇编语言设计一个程序大致上可分为以下几个步骤 1 分析题意 明确要求 解决问题之前 首先要明确所要解决的问题和要达到的目的 技术指标等 2 确定算法 根据实际问题的要求 给出的条件及特点 找出规律性 最后确定所采用的计算公式和计算方法 这就是一般所说的算法 算法是进行程序设计的依据 它决定了程序的正确性和程序的指令 3 画程序流程图 用图解来描述和说明解题步骤 4 分配内存工作单元 确定程序与数据区的存放地址 5 编写源程序 6 程序优化 7 上机调试 修改和最后确定源程序 程序的基本结构概述 在七十年代初 由Boehm和Jacobi提出并证明了程序结构定理 任何程序都可以由三种基本结构程序构成结构化程序 这三种基本结构是 顺序结构 条件结构 即分支结构 和循环结构 每个结构只有一个入口和一个出口 三种结构的组合和嵌套就构成了结构化的程序 三种基本程序结构具体又可以分为五种基本的逻辑结构 1 顺序结构 2 If条件then else 3 Case结构 4 DoWhile 5 Do Until 循环结构基本组成部分1 初始化部分 循环次数 数据指针 地址和相关参数赋初始值 2 循环体部分 循环结构核心 3 修改初值部分 调整初始值 循环次数 数据指针 地址和相关参数 4 判断部分 控制循环部分 判断循环是否结束 或是否需继续 程序流程图的绘制 程序流程图是一种算法表达工具 程序流程图的绘制应遵守国家标准GB1525 89 信息处理 数据流程图 程序流程图 系统流程图 程序网络图和系统资源图的文件编制符号及约定 对流程图中符号表示及使用规则的规定 汇编语言中一般仅使用以下几种 国家标准GB1525 89的符号表示定 2 顺序程序结构 顺序结构程序是一种最简单 最基本的程序 也称为简单程序 它是一种无分支的直线形程序 按照程序编写的顺序依次执行 例 编写程序 将外部RAM单元中0040H单元4位BCD数转换成ASCII码 送到内部RAM单元60H 61H之中 解 根据ASCII字符表 十进制数0 9的ASCII码和它的BCD码之间仅相差30H 本题需要把一个字节的两位BCD数进行拆分 然后分别和30H相加 即得到相应的ASCII码 程序如下 ORG0000HADDR1DATA0040HADDR2EQU60HStart MOVDPTR ADDR1 源地址 DPTRMOVR0 ADDR2 目标地址 R0MOV R0 00H 目标地址单元清零MOVXA DPTR 源地址单元中BCD数送AMOVB AANLA 0FHORLA 30H 完成低位BCD数转换MOV R0 A 存入60HINCR0MOVA BANLA 0F0HSWAPA 高位BCD数送低4位ORLA 30H 完成高位BCD数转换MOV R0 A 存入61HSJMP END 3 分支程序结构 分支程序的特点是改变程序的执行顺序 跳过一些指令 去执行另外一些指令 应注意 对每一个分支都要单独编写一段程序 每一分支的开始地址赋给一个标号 在编写分支程序时 关键是如何判断分支的条件 在MCS 51系列单片机中可以直接用来判断分支条件的指令并不多 只有累加器为零 或不为零 比较条件转移指令CJNE等 MCS 51单片机还提供了位条件转移指令 如JC JNC JB JNB JBC等 把这些指令结合在一起使用 就可以完成各种各样的条件判断 例 设计比较两个无符号8位二进制数大小 并将较大数存入高地址中的程序 设两数分别存入30H和31H中 并设30H 42H 31H 30H 解 程序流程图如图所示 为选择结构程序中的单分支程序流程图 汇编语言程序如下 ORG0000HLJMPSTARORG2000HSTAR MOV30H 42H 30H 42HMOV31H 30H 31H 30HCLRC C 0MOVA 30H A 30HSUBBA 31H 作减法比较两数JCNEXT 31H 30H转MOVA 30H 30H大则XCHA 31H 大数存入31H中MOV30H A 小数存入30H中NEXT SJMP END 4 循环程序结构 顺序程序和分支程序中的指令 最多只执行一次 在实际问题中重复地做某些事的情况是很多的 用计算机来做这些事就要重复地执行某些指令 重复地执行某些指令 最好用循环程序实现 循环程序一般由4部分组成 1 置循环初值 即设置循环过程中有关工作单元的初始值 如置循环次数 地址指针及工作单元清零等 2 循环体 即循环的工作部分 完成主要的计算或操作任务 是重复执行的程序段 3 循环修改 每循环一次 就要修改循环次数 数据及地址指针等 4 循环控制 根据循环结束条件 判断是否结束循环 例 多个单字节数求知 已知有10个单字节数 依次存放在内部RAM40H单元开始的数据存储区中 求和并将结果存人寄存器R2 R3中 高位存R2 低位存R3 解 要重复进行加法运算 因此采用循环结构程序 循环次数就是数据块字节数 这是已知的 在置初值时 将数据块长度置人寄存器R5 将数据块首地址送人寄存器R0 即以R0作为数据块的地址指针 采用间接寻址方式 每做一次加法之后 修改地址指针 以便取出下一个数来相加 并且使计数器R5减l 到R5减为0时 求和结束 ORG2000HSUM MOVR0 40H 设地址指针MOVR5 0AH 计数器初值送R5MOVA 00HMOVR2 ALP ADDA R0JNCLP1INCR2 若有进位 和的高八位 1LP1 INCR0 地址指针 1DJNZR5 LP 判循环结束条件MOVR3 A 存和的低八位END 例 已知内部RAM的BLOCK单元开始有一无符号数据块 块长在LEN单元 请编出求数据块中各数累加和 并存入SUM单元的程序 解 为了对两种循环结构有一个全面了解 以便进行分析比较 现给出两种设计方案 解 方法1 先判断后处理 流程图见图4 6 a ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA A清零MOVR2 LEN 块长送R2MOVR1 BLOCK 块始地址送R1INCR2 块长 1SJMPCHECKLOOP ADDA R1 A R1 送AINCR1 修改数据块指针R1CHECK DJNZR2 LOOP 若未完 则转LOOPMOVSUM A 存累加和SJMP END 方法2 先处理后判断 流程图见图4 6 b ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA A清零MOVR2 LEN 块长送R2MOVR1 BLOCK 数据始地址送R1NEXT ADDA R1 A R1 送AINCR1 修改数据块指针R1DJNZR2 NEXT 若未完 则转NEXTMOVSUM A 存累加和SJMP END 5 主程序调用子程序结构 汇编语言编程时 应考虑到恰当地使用子程序 使整个程序的结构清楚 而且阅读和理解方便 使用子程序还可以减少源程序和目标程序的长度 在多次调用同样的程序段时 采用子程序就不必每次重复书写同样的指令 而只需书写一次 当然从程序的执行来看 每调用一次子程序都要附加保护断点 进栈和出栈等操作 增加程序的执行时间 但一般来说 付出这些代价总是值得的 在汇编语言源程序中使用子程序时 一般要注意两个问题 1 参数传递 2 现场保护与恢复 参数传递一般可采用以下方法 传递数据 传送地址 通过堆栈传递参数 通过位地址传送参数 例 设计一程序 由它的主程序循环调用子程序SHY 子程序SHY使连接到单片机P1口上的8个LED灯中的某个闪烁5次 主程序中的指令RLA将确定某个LED灯闪烁 解 本例中的子程序入口地址是标号SHY地址 子程序返回指令是RET 主程序调用该子程序的调用指令是ACALLSKY 为观察到LED灯的闪烁 要求状态时钟信号频率低 为此 单片机可采用频率很低的外部振荡器信号 解 ORG0000HMOVA 0FEH 灯亮初值STAR ACALLSKY 调用闪烁子程序RLA 左移SJMPSTAR 短跳到STAR 循环 以上程序段为主程序 以下程序段为子程序 SHY为其入口SKY MOVR2 5 闪烁子程序 闪烁5次计数SKY1 MOVP1 A 点亮NOP 延时MOVPL 0FFH 熄灭NOP 延时DJNZR2 SHY1 循环RET 子程序返回END 例 将内部数据存储器某一单元中的一个字节的十六进制数转换成两位ASCII码 结果存放在内部数据存储器的两个连续单元中 假设一个字节的十六进制数在内部数据存储器40H单元 结果存于41H 42H单元中 用堆栈进行参数传递 解 本例采用堆栈进行参数的传递 要注意子程序调用时 返回地址也压入堆栈 另外 采用查表法完成16进制到ASCII的转换 ORG1000H 主程序MAIN MOVSP 55HMOVR1 41H R1为存结果指针MOVA 40H 取要转换的数据SWAPA 先转换高位字节PUSHACC 压栈LCALLHEASC 调用低半字节转换成POPACC 要转换的数据出栈MOV R1 A 存高半字节转换结果INCR1PUSH40HLCALLHEASCPOPACCMOV R1 A 存低半字节转换结果SJMP 子程序HEASC 功能 将堆栈中的低4位 转换为ASCII码 入口参数 堆栈 出口参数 堆栈 HEASC MOVR0 SPDECR0DECR0XCHA R0 取被转换数据ANDA 0FH 保留低半字节ADDA 2 修改AMOVCA A PC 查表XCHA R0 结果送回堆栈RETTAB DB30H 31H 32H 33H 0 3DB34H 35H 36H 37H 4 7DB38H 39H 41H 42H 8 BDB43H 44H 45H 46H C FEND 问题1 为什么要加2 问题2 为什么不连续 ADDA 2 39H 41H 1 加法程序 51指令系统中有加 减 乘 除 加1 减1等指令 可通过设计程序来处理一般不大复杂的算术运算 设计中要注意程序执行对PSW的影响 多字节加 减运算是应用程序设计中经常要进行的一种运算 加 减运算程序可以分为无符号多字节数加减运算和带符号多字节数加减运算程序两种 例 两个无符号双字节数相加 设被加数存放在内部存储器40H 高位字节 41H 低位字节 单元 加数存放在内部存储器50H 高位字节 51H 低位字节 单元 和存入40H 高位字节 41H 低位字节 单元 解 ORG0000HCLRC 将C清零MOVR0 41H 送被加数首址MOVR1 51H 送加数首址MOVA R0 取被加数低字节ADDA R1 两个低字节相加MOV R0 A 低字节和存人被加数低字节DECR0 修改指针 指向被加数高字节DECR1 修改指针 指向加数高字节MOVA R0 取被加数高字节ADDCA R1 高字节相加MOV R0 A 存结果SJMP END 例 设在BLOCK和BLOCK 1单元中有两个补码形式的带符号数 请编出求两数之和 并把它放在SUM和SUM 1单元 低8位在SUM单元 的子程序 解 在两个8位二进制带符号数相加时 其和很可能会超过8位数能表示的范围而需要采用16位数形式来表示 因此 在进行加法时 可以预先把这两个加数扩张成16位二进制补码形式 然后对它完成双字节相加 因此 一个8位二进制正数扩张成16位时只要把它的高8位变成全 0 一个8位二进制负数扩张成16位时需要把它的高8位变成全 1 据此 我们在编程时应在加减运算前先对加数和被加数进行扩张 然后完成求和 设R2和R3分别用来存放被加数和加数高8位 解 ORG1000HSBADD PUSHACCPUSHPSW 保护现场MOVPSW 08HMOVR0 BLOCK R0指向一个加数MOVR1 SUM R1指向和单元MOVR2 00H 高位先令其为零MOVR3 00HMOVA R0 一个加数JNBACC 7 POS1 若为正数 则转POS1MOVR2 0FFH 若为负数 则全 1 送R2 POS1 INCR0 R0指向下一个加数MOVB R0 取第二加数到BJNBB 7 POS2 若是正数 则转POS2MOVR3 0FFH 若是负数 则全 1 送R3POS2 ADDA B 低8位相加MOV R1 A 存低8位和INCR1 R1指向SUM 1单元MOVA R2ADDCA R3 完成高8位求和MOV R1 A 存高8位和POPPSW 恢复现场POPACCRETEND 例 已知BLOCK 和BLOCK2为起始地址的存储区中分别有5字节无符号被减数和减数 低位在前 高位在后 请编制一个减法子程序 令它们相减 并把差值放入BLOCK1为起始地址的存储单元 解 用减法指令从低字节开始相减 相应程序为 2 减法程序 解 ORG1000HSBYTESUB MOVR0 BLOCK1 被减数始址送R0MOVR1 BLOCK2 减数始址送R1MOVR2 05H 字长送R2LOOP CLRC Cy清零MOVA R0 被减数送ASUBBA R1 相减MOV R0 A 存差INCR0 修改被减数地址指针INCR1 修改减数地址指针DJNZR2 LOOP 若未完 则LOOPRETEND 例 多字节十进制BCD码减法子程序 解 设计成子程序 子程序描述子程序名 SBCD功能 多字节BCD码减法入口参数 被减数低字节地址在R1 减数低字节地址在R0 字节数在R2 出口参数 差 补码 的低字节地址在R0 字节数在R3 07H为符号位 0 为正 1 为负 2 减法程序 MCS 51指令系统中只有十进制加法调整指令DAA 也即该指令只有在加法指令 ADD ADDC 后 才能得到正确的结果 为了用十进制加法调整指令对十进制减法进行调整 必须采用补码相加的办法 用9AH 相当于100 减去减数即得到以十为模的减数的补码 ORG1000HSBCD MOVR3 00H 差字节数置0CLR07H 符号位清0CLRC 借位位清0SBCD1 MOVA 9AH 减数对100求补码SUBBA R0ADDA R1 补码相加DAA 十进制相加调整MOV R0 A 存结果INCR0 地址值增加1INCR1INCR3 差字节增加1CPLC 进位位求反 以形成正确的借位DJNZR2 SBCD1 未减完 转SBCD1 继续JNCSBCD2 无借位 转SBCD2SETB07H 有借位 置 1 符号位SBCD2 RET 返回主程序 例 设R0和R1中有两个补码形式的带符号数 试编写出求两数之积并把积送入R3R2 R3内为积的高8位 中的程序 解 MCS 51乘法指令是对两个无符号数求积的 若要对两个带符号数求积 则可采用对符号位单独处理的办法 相应处理步骤如下 1 单独处理被乘数和乘数的符号位 2 求被乘数和乘数的绝对值 并使两绝对值相乘而获得积的绝对值 3 对积进行处理 若积为正 则对积不作处理 若它为负 则对积求补 使之变为补码形式 8位有符号数乘法程序如下 3 乘除法程序 ORG1000HSBITBIT20H 0SBIT1BIT20H 1SBIT2BIT20H 2 MOVA R0 被乘数送ARLCA 被乘数符号送CyMOVSBIT1 C 送入SBIT1MOVA R1 乘数送ARLCA 乘数符号送CyMOVSBIT2 C 送入SBIT2 ANLC SBIT1 SBIT1 SBIT2送CyMOVSBIT C 送入SBITMOVC SBIT1 SBIT1送CyANLC SBIT2 SBIT1 SBIT2送CyORLC SBIT 积的符号位送CyMOVSBIT C 送入SBIT MOVA R0 处理被乘数JNBSBIT1 NCH1 若它为正 则转NCH1CPLA 若它为负 则求补得绝对值INCANCH1 MOVB A 被乘数绝对值送BMOVA R1 处理乘数JNBSBIT2 NCH2 若它为正 则转NCH2CPLA 若它为负 则求补得绝对值ADDA 01HNCH2 MULAB 求积的绝对值JNBSBIT NCH3 若它为正 则转NCH3CPLA 若它为负 则低字节求补ADDA 01HNCH3 MOVR2 A 积的低字节存入R2MOVA B 积的高字节送AJNBSBIT NCH4 若它为正 则转NCH4CPLA 若它为负 则高字节求补ADDCA 00HNCH4 MOVR3 A 积的高字节存入R3SJMP 结束END 1 码制转换程序 在单片机应用程序的设计中 经常涉及到各种码制的转换问题 在单片机系统内部进行数据计算和存储时 多采用二进制码 二进制码具有运算方便 存储量小的特点 在输入 输出中 按照人的习惯多采用代表十进制数的BCD码 用4位二进制数表示的十进制数 表示 例4 17 将单字节二进制数转换成BCD码 解 算法 将二进制数除100的商为百位数 余数除以10商为十位数 余数为个位数 单字节二进制 或十六进制 数在0 255之间 设单字节数在累加器A中 转换结果的百位数放在R3中 十位和个位同放入A中 除法指令完成的操作为 A除以B的商放入A中 余数放入B中 1 二进制 或十六进制 数转换成BCD码 计算机中BCD码有两种形式 非压缩BCD码 1个字节放1位BCD码 压缩BCD码 1个字节放2位BCD码 ORG0000HMOVA 89H 十六进制数89H送A中MOVB 100 100作为除数送入B中DIVAB 十六进制除以100MOVR3 A 百位数送R3 余数在B中MOVA 10 分离十位和个位数XCHA B 余数送入A中 除数10在B中DIVAB 分离出十位在A中个位在B中SWAPA 十位数交换到A中的高4位ADDA B 将个位数送入A中的低4位结束开始取BCD数SJMP END结果 R3 1 A 37H 89H的BCD为137 例4 18 将单字节BCD码转换为二进制数 解 算法 百位数乘100 十位数乘10 个位数 设单字节压缩BCD码存放在R2中 将其转换为二进制数存入R3中 源程序如下 2 BCD码转换成二进制 或十六进制 数 STAR MOVR2 89H 设待转换BCD码为89MOVA R2 A R2ANLA 0F0H 屏蔽低4位SWAPA 高四位与低四位交换MOVB 10 乘数MULAB 相乘MOVR3 A 乘积暂存R3MOVA R2 A R2ANLA 0FH 屏蔽高4位ADDA R3 A A R3MOVR3 A 结果存入R3SJMP END设待转换BCD码为89 则本例运行结果为 十六进制数59H放在R3中 例4 19 将一个十六进制转换为ASCII代码 解 从十六进制数与ASCII码的关系可知 当十六进制数在0 9范围时 则此十六进制数加上30H即得到相应的ASCII码 若十六进制数在A F范围时 则该十六进制数应加上37H才是相应的ASCII码 编写转换子程序 子程序名 H2ASC功能 将一位16进制数转换ASCII码入口 待转换的十六进制数存放在R2中出口 转换后的ASCII码存放在R2中 3 十六进制转换为ASCII代码 ORG1000HH2ASC MOVA R2ANLA 0FH 屏蔽高4位PUSHACC 压入堆栈CLRCSUBBA 0AH 与数10比较POPA 恢复待转换数JCLOOP 小于10 则转LOOP执行ADDA 07H 否则 该数先加7LOOP ADDA 30H 加30H 得到ASCII码MOVR2 A 结果存于R2RET 返回 2 查表程序 在单片机应用系统中查表程序是一种常用的程序 它可以完成数据计算 转换 补偿等各种功能 具有程序简单 执行速度快等优点 在MCS51单片机中 数据表格是存放在程序存储器ROM中 而不是在RAM中 编写程序时 可以通过DB或DW伪指令以表格形式将数据类似表格的形式列于ROM中 用于查表的指令有两条 MOVCA A DPTRMOVCA A PC 将1位16进制数转换为ASCII码 设1位16进制数放在R0的低四位 转换为ASCII后再送回R0 用查表法设计程序 使用查表指令MOVCA A DPTR 使用MOVCA A DPTRORG0000HMOVR0 0BH 设R0 BHMOVA R0 读数据ANLA 0FH 屏蔽高4位MOVDPTR TAB 置表格首地址MOVCA A DPTR 查表MOVR0 A 回存SJMP TAB DB30H 31H 32H 33H 34HDB35H 36H 37H 38H 39H 0 9的ASCII码DB41H 42H 43H 44H 45H 46H 0 F的ASCII码END 使用MOVCA A PCORG0000HMOVR0 0BH 设R0 BHMOVA R0 读数据ANLA 0FH 屏蔽高4位ADDA 03H 加偏移量MOVCA A PC 查表MOVR0 A 回存SJMP TAB DB30H 31H 32H 33H 34HDB35H 36H 37H 38H 39H 0 9的ASCII码DB41H 42H 43H 44H 45H 46H 0 F的ASCII码END 例4 23 假定数据区首地址是片内RAM20H 数据的长度为10 关键字存放在30H单元中 把检索成功的数据序号放在31H单元中 若数据区中无该关键字 则31H单元存放00H标志 3 检索程序 检索程序是在指定数据区中查找关键字的程序 一般有两种检索方法 顺序检索和对分检索 下面我们只介绍顺序检索 ORG2000HMOVR0 20H 数据区的首地址MOVR7 0AH 数据个数MOVR2 00H 序号初值MOV30H KEY 关键字NEXT INCR2MOVA 30H 取关键字SUBBA R0 与关键字比较JZENDP 相同则转INCR0 修改指针DJNZR7 NEXT 继续MOVR2 00HENDP MOV31H R2 送检索结果HERE AJMPHEREEND 例 试编程计算下式 设乘积小于255 X Y分别存在3001H和3002H单元中 结果Z存于3000H单元中 解 程序流程图如下 Z 25 取X N Y Z X Y Z X Y 商 保存Z Y N 补充 分段函数 求最大值或最小值 1 无符号数求最大值或最小值例 在以2042H为首址的存储单元中 连续存放一组单字节无符号数 数据个数存于2041H单元 编写程序 从中找出最大数存于2040H单元 算法 假设第一个数为最大数 取出存于缓冲器内 然后逐次取出其余数据与缓冲器内容相比较 凡大于的就替代缓冲器中原有的内容 全部比较完后 缓冲器中的数即为最大数 2 有符号数求最大值或最小值 51没有专用的比较指令 也没有符号标志 因此有符号数的比较只能使用减法指令SUBB 然后通过判断Acc 7 符号位 和OV的状态来确定 两个有符号数的大小 有符号数比较标志状态表 有符号数比较的编程方法 有符号数求最大值或最小值的程序 略 要求有符号数 无符号数求最大值和最小值均应掌握 1 算法分析 排序算法很多 此处仅介绍气泡法排序 在待排序的数据区内 若由n个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解析卷人教版八年级物理上册第5章透镜及其应用-生活中的透镜专题测评试题(解析版)
- 难点解析人教版八年级物理上册第6章质量与密度-质量难点解析试卷(解析版)
- 2025年葡萄霜霉病绿色防控技术考核试卷
- 2025年互联网与信息技术岗位晋升考试数字人交互设计与应用数字人内容创作用户研究考核试卷
- 2025年急诊急救技术应用专项能力测试(新冠重症患者中医护理)考核试卷
- 考点解析人教版八年级物理上册第6章质量与密度-质量定向攻克试卷(附答案详解)
- 难点解析-人教版八年级物理上册第4章光现象专项测试试卷(含答案详解)
- 2025年建筑教育合同协议
- 2025临床医学综合能力(西医)考研专业型硕士专项模拟考核试卷
- 商铺如何装修合同(标准版)
- 2025年广东省深圳市检察机关招录劳动合同制司法辅助人员综合素质测试练习题及答案
- 2025公安机关人民警察(高级)执法资格证考试模拟试题及答案
- 煤矿生产设备及材料查验制度
- 市监局春季业务知识培训课件
- 2025年国家公务员考试【申论】真题模拟试题(行政执法卷)含答案
- 盐场营销方案
- 学生核辐射知识培训课件
- 医疗废物与废水知识培训课件
- 监理协会环保安全监理培训考试题及答案解析
- 2025年度领导干部任前应知应会党内法规和法律知识考试题(附答案)库
- 商场招商培训实务指南
评论
0/150
提交评论