




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章第四章 汇编语言程序设计汇编语言程序设计 本章的汇编语言程序设计的主要内容有 汇编语言程序设计概述 汇编语言程序的结构形 式 汇编语言的伪指令 一个单片机应用系统和其它计算机系统一样 在完成一项具体工作的时候 它要按 照一定的次序 去执行操作 这些操作实际上就是由设计人员 以单片机能够接受的指令 编制的程序 那么无论计算机也好 单片机也好 实际上编制程序的过程 就是用计算机 来反映设计者的编程思想 那么这一章中 我们将向大家介绍怎样使用单片机指令系统来 编制一些应用程序 在介绍之前 我们还是来学习汇编语言的一些基础知识 4 1 汇编语言程序设计概述汇编语言程序设计概述 1 计算机的汇编语言 计算机的汇编语言 以助记符表示的指令 每一条指令就是汇编语言的一条语句以助记符表示的指令 每一条指令就是汇编语言的一条语句 汇编语言程序设计实际上就是使用汇编指令来编写计算机程序 汇编语言的语句有 严格的格式要求 2 汇编语言的语句格式 汇编语言的语句格式 MCS 51 汇编语言的语句格式表示如下 汇编语言的语句格式表示如下 标号 指令的符号地址 有了标号 程序中的其它语句才能访问该语句 标号 指令的符号地址 有了标号 程序中的其它语句才能访问该语句 标号是由标号是由 1 8 个个 ASCII 字符组成 但头一个字符必须是字母 其余字符可以是字母 字符组成 但头一个字符必须是字母 其余字符可以是字母 数字或其它特定字符 数字或其它特定字符 不能使用汇编语言已经定义了的符号作为标号 如指令助记符 伪指令记忆符以及寄存不能使用汇编语言已经定义了的符号作为标号 如指令助记符 伪指令记忆符以及寄存 器的符号名称等 器的符号名称等 同一个标号在程序中只能定义一次 不能重复定义 一条语句可以有标号 也可以没有 标号 所以是否有标号 取决于程序中是否需要访问该语句 操作码 规定语句执行的操作内容 操作码是以指令助记符表示的 是汇编指令格式中唯操作码 规定语句执行的操作内容 操作码是以指令助记符表示的 是汇编指令格式中唯 一不能空缺的部分 一不能空缺的部分 操作数 给指令的操作提供数据或地址 操作数 给指令的操作提供数据或地址 注释 是对语句或程序段的解释说明注释 是对语句或程序段的解释说明 在单片机中 这四个部分怎么加以区分呢 使用分界符 分界符 分隔符 用于把语句格式中的各部分隔开 以便于编译程序区分不同的指令段分界符 分隔符 用于把语句格式中的各部分隔开 以便于编译程序区分不同的指令段 冒号 用于标号之后冒号 用于标号之后 空格 空格 用于操作码和操作数之间 用于操作码和操作数之间 逗号 逗号 用于操作数之间 分割两个以上的操作数 用于操作数之间 分割两个以上的操作数 分号 用于注释之前 分号 用于注释之前 注释部分汇编语言不对它们进行编译的 而是将标号 操作码 操作数部分加以翻译成 机器码 看一个例子 表面是延时子程序的第一条语句 故加上标号 便于访问 上面的语句如何编译的 呢 ORG 3000H 3000H E8HDELY MOV A R0 这是延时子程序这是延时子程序 在这条指令前 加一个伪指令 定义程序首地址 我们把这一段语句定义为从 3000H 开始 经过编译以后 那么这一条语句的标号部分 DELY 这时候就转化为实际的 地址值 3000H 指令操作码和操作数部分编译后为 E8H 这就是汇编语言与机器代码之间 的关系 这个转化工作是由编译程序来完成的 4 2 单片机汇编语言程序的结构形式单片机汇编语言程序的结构形式 一般有三种形式 顺序结构 分支结构 循环结构顺序结构 分支结构 循环结构 下面我们来依次介绍一下这些结构 1 顺序结构程序设计 顺序结构程序设计 顺序程序是最简单的程序结构 在顺序程序中既无分支 循环 也不调用子程序 程顺序程序是最简单的程序结构 在顺序程序中既无分支 循环 也不调用子程序 程 序执行时一条一条地按顺序执行指令 序执行时一条一条地按顺序执行指令 下面来看一个例子 该部分程序完成一个 3 字节无符号数的加法 例例 4 1 三字节无符号数相加 被加数在内部 三字节无符号数相加 被加数在内部 RAM 的的 50H 51H 和和 52H 单元中 加数在单元中 加数在 内部内部 RAM 的的 53H 54H 和和 55H 单元中 其中被加数单元和加数单元的高位地址存放的为单元中 其中被加数单元和加数单元的高位地址存放的为 最低位字节 要求把相加之和存放在最低位字节 要求把相加之和存放在 50H 51H 和和 52H 单元中 进位位存放在位寻址区的单元中 进位位存放在位寻址区的 00H 位中位中 我们来看编制的程序 ADDU MOV R0 52H 被加数的低字节地址被加数的低字节地址 MOV R1 55H 加数的低字节地址加数的低字节地址 MOV A R0 取被加数的最低位数据取被加数的最低位数据 ADD A R1 与加数的最低字节相加 第一次相加 不考与加数的最低字节相加 第一次相加 不考 虑进位位 虑进位位 MOV R0 A 存低字节相加结果存低字节相加结果 DEC R0 地址减地址减 1 DEC R1 MOV A R0 ADDC A R1 中间字节带进位相加中间字节带进位相加 MOV R0 A 存中间字节相加结果存中间字节相加结果 DEC R0 地址减地址减 1 DEC R1 MOV A R0 ADDC A R1 高位字节带进位相加 高位字节带进位相加 MOV R0 A 存高字节相加结果存高字节相加结果 CLR A 进位送进位送 00H 位保存 位保存 对对 A 清零清零 ADDC A 00H 把进位位移到 把进位位移到 A 的最低位 的最低位 MOV 20H A 进位位送入位地址进位位送入位地址 00H 相当于把 相当于把 A 的最低位放到的最低位放到 20H 的最低位 的最低位 RET 2 分支结构程序设计 分支结构程序设计 程序分支是通过转移指令实现的 为清除起见 把分支程序分为以下几种情况 程序分支是通过转移指令实现的 为清除起见 把分支程序分为以下几种情况 单分支程序单分支程序 单分支使用条件转移指令实现 即根据条件对程序的执行进行判断 满足条件则单分支使用条件转移指令实现 即根据条件对程序的执行进行判断 满足条件则 进行程序转移 否则程序顺序执行 进行程序转移 否则程序顺序执行 多分支程序多分支程序 使用多条使用多条 CJNE 指令 通过连续比较 实现多分支程序转移 指令 通过连续比较 实现多分支程序转移 使用查地址表方法实现多分支程序转移 使用查地址表方法实现多分支程序转移 使用查转移指令表的方法实现多分支程序转移 使用查转移指令表的方法实现多分支程序转移 通过堆栈操作实现多分支程序转移 通过堆栈操作实现多分支程序转移 我们就下面的例子来看看利用多条 CJNE 如何实现多分支程序转移的 例例 4 2 有一温度控制系统 现场采集的温度值 有一温度控制系统 现场采集的温度值 Ta 放在累加器放在累加器 A 中 此外 在内部中 此外 在内部 RAM 54H 单元存放控制温度下限值 单元存放控制温度下限值 T54 在 在 55H 单元存放控制温度上限值 单元存放控制温度上限值 T55 若 若 Ta T55 则程序转向 则程序转向 JW 降温处理程序 降温处理程序 若 若 Ta T54 则程序转向 则程序转向 SW 升温处理程序 升温处理程序 若若 T55 Ta a T54 则程序转向 则程序转向 FH 返回主程序 返回主程序 下面是简单的程序段 有关程序段如下 有关程序段如下 CJNE A 55H LOOP1 AJMP FH LOOP1 JNC JW CJNE A 54H LOOP2 AJMP FH LOOP2 JC SW FH RET JW SW SW CJNE 对两数做相减 但不把减的结果写回去 仅用来改变标志位 C 3 循环程序 循环程序 循环是为了重复执行一个程序段 循环是为了重复执行一个程序段 MCS 51 汇编语言中虽然没有专用的循环指令 但汇编语言中虽然没有专用的循环指令 但 可以使用条件转移指令通过条件判断来控制循环是否结束可以使用条件转移指令通过条件判断来控制循环是否结束 4 3 MCS 51 汇编语言的伪指令汇编语言的伪指令 伪指令是程序员发给汇编程序的命令 也称为汇编命令或汇编程序控制指令伪指令是程序员发给汇编程序的命令 也称为汇编命令或汇编程序控制指令 一般在 51 单片机中用到的伪指令有以下几个 ORG 汇编起始地址命令汇编起始地址命令 命令格式 命令格式 ORG 其中其中 是选择项 根据需要选用 是选择项 根据需要选用 项 通常为项 通常为 16 位绝对地址 但也可以使用标号或表达式表示 位绝对地址 但也可以使用标号或表达式表示 这个伪指令一般出现在程序的起始位置 用来规定目标程序的起始地址 例如 例如 例如 ORG 8000H 8000H 74H START MOV A 00H 8001H 00H END 汇编终止命令汇编终止命令 命令格式 命令格式 END END 是汇编语言源程序的结束标志 是汇编语言源程序的结束标志 因此 汇编语言源程序只能有一条该伪指令 编译系统在编译过程中 遇到该伪指令就 会停止编译 即只对 END 之前的程序编译 后面的程序不再编译 EQU EQUate 赋值命令赋值命令 命令格式 命令格式 EQU 例 例 DATA1 EQU 40H 用 DATA1 来表示 40H 单元 以后程序中出现 DATA1 就代表 40H 单元 但如何区分它是 代表数据还是地址呢 这主要看程序中的指令形式 如果是数据 则应加 即 DATA1 否则为地址 执行 执行 MOV A DATA1 DATA1 为片内的为片内的 40H 单元单元 执行 执行 MOV A DATA1 DATA1 为数据为数据 40H DB 定义字节命令定义字节命令 命令格式 命令格式 DB 主要用于在程序区定义一些常数表格 例如 例如 存放七段数码管 共阳极 显示的十六进制数的字型码 可使用多条存放七段数码管 共阳极 显示的十六进制数的字型码 可使用多条 DB 命令定命令定 义 义 ORG 8100H LED TAB DB C0H F9H A4H B0H DB 99H 92H 82H F8H DB 80H 90H 88H 83H DB C6H A1H 86H 84H 这些数据依次存放在这些数据依次存放在 8100H 为起始地址的程序存储区中为起始地址的程序存储区中 它们是共阳极七段数码管 的字型数据 把它们组成常数表格放在程序存储区 DW 定义数据字命令定义数据字命令 命令格式 命令格式 DW 在本讲中我们介绍了汇编语言的格式 几种基本的程序结构格式 伪指令等 希望大 家在课后的练习加以熟悉掌握 从这一讲开始 我们来讲授单片机汇编语言程序设计 它有两部分构成 一部分是与硬 件电路密切相关的程序 我们将在介绍硬件的过程中加以介绍 另一个部分就是类似于数 值运算 数值转换等这样一类程序 这一章中 我们主要向大家介绍后一类的程序 4 4 MCS 51 单片机汇编语言程序设计举例单片机汇编语言程序设计举例 一个单片机的应用系统程序 根据系统应用的范围 复杂程度的不同 程序的复杂程度 也是不同的 但作为单片机的应用系统程序应该包括 1 主程序 主程序 顺序执行的无限循环的程序 运行过程处于全封闭状态 顺序执行的无限循环的程序 运行过程处于全封闭状态 例如 例如 带显示及键盘输入的某单片机系统的主程序框图结构为 带显示及键盘输入的某单片机系统的主程序框图结构为 上电 复位后对相关的寄存器进行初始化 调用显示子程序 显示初始状态 调用键盘 扫描子程序的功能就是在那里等待你的键盘输入 当有键按下 就调用相应的键的识别子 程序 来识别到底是哪个键被按下 不同键有不同的处理程序 当键值识别子程序完成后 回到显示子程序 构成一个封闭的环 连续不断地运行下去 下面我们再来看什么是子程 序 2 子程序 子程序 完成某种特定功能的一个程序段 也称为一个程序模块完成某种特定功能的一个程序段 也称为一个程序模块 子程序是供其它程序反复使用的 完成某种特定功能的程序段 采用子程序结构 可以 简化程序的逻辑结构 缩短程序的长度 提供给其它程序使用的子程序要与其它程序进行信息交换 必须要告知其它程序 我这 个子程序调用的条件是什么 即有什么样的入口参数 同时也要告知处理的结果放在哪儿 即子程序也要有出口参数 完成子程序与其它程序之间完成数据传递 因此 作为子程序 要有以下约定 作为子程序 要有以下约定 子程序功能 子程序功能 程序入口 程序入口 程序出口 程序出口 程序影响 程序影响 程序影响指影响哪些寄存器 在这里仍以前面介绍过的三字节无符号数的加法为例 子程序功能 子程序功能 完成三字节无符号数的加法 完成三字节无符号数的加法 程序入口 程序入口 50H 51H 52H 为被加数 数据结构是为被加数 数据结构是 50H 为最高位为最高位 55H 54H 53H 为加数 数据结构是为加数 数据结构是 53H 为最高位为最高位 程序出口 程序出口 50H 51H 52H 为和值 数据结构是为和值 数据结构是 50H 为最高位 位地址为最高位 位地址 00H 为进位位 为进位位 程序影响 程序影响 R0 R1 R7 A 下面是这一段程序 ADDU MOV R0 52H 被加数的低字节地址被加数的低字节地址 MOV R1 55H 加数的低字节地址加数的低字节地址 MOV R7 3 三字节加法 循环次数为三次三字节加法 循环次数为三次 CLR C 清进位位清进位位 LOOP MOV A R0 取被加数取被加数 ADDC A R1 与加数相加与加数相加 MOV R0 A 存相加结果存相加结果 DEC R0 地址减地址减 1 DEC R1 DJNZ R7 LOOP 未完 继续未完 继续 MOV 00H C 存进位位存进位位 RET 假如我们要做一个三字节无符号数的加法 例如 例例 4 3 已知有数据 已知有数据 3A59F0H F687B2H 请利用以上程序完成加法运算 并将和值送往片请利用以上程序完成加法运算 并将和值送往片 外外 RAM 的的 50H 51H 52H 单元 单元 我们怎么来调用这个程序呢 首先根据提供的入口条件 将需要相加的数分别送往加数 和被加数的单元 在这儿通过数据传送类指令来完成 对照程序说明 具体如下 MOV 52H 0F0H 送被加数送被加数 MOV 51H 59H MOV 50H 3AH MOV 55H 0B2H 送加数送加数 MOV 54H 87H MOV 53H 0F6H LCALL ADDU 调用多字节加法子程序调用多字节加法子程序 MOV R0 50 和值送往外部和值送往外部 RAM MOV R7 03H LOOP MOV A R0 MOVX R0 A INC R0 DJNZ R7 LOOP 假设我们需要把运算结果送外部 RAM 保存 又如何呢 对照程序的后半段予以说明 3 中断服务程序 中断服务程序 中断服务程序是为了完成中断请求而编制的程序中断服务程序是为了完成中断请求而编制的程序 中断服务程序和子程序有相同点 也有不同点 相同在于两者都有断点 对子程序来说 断点是确定的 它就是调用子程序语句的下一条语句的地址 见下图的左边部分 说明调 用过程 而中断服务程序的断点是不确定 因为不能事先预知中断何时发生 介绍完单片机程序设计的基本概念后 我们来看一些程序设计举例 算术运算程序算术运算程序 双字节无符号数乘法子程序双字节无符号数乘法子程序 例例 4 4 要进行两个双字节无符号数乘法运算 被乘数和乘数分别存放于内部要进行两个双字节无符号数乘法运算 被乘数和乘数分别存放于内部 RAM 的的 R2 R3 单元和单元和 R6 R7 单元中 其中单元中 其中 R2 和和 R6 分别为高位字节 分别为高位字节 相乘结果 积 依次 相乘结果 积 依次 存放在存放在 R4 R5 R6 R7 单元中单元中 在单片机中 由于只有一条单字节的乘法指令 因此需要编写一个子程序来完成多字节 的乘法运算 我们先来讲一下乘法运算的规则 对乘法运算规则给予解释 部分积 1 为 16 位 它是乘数低 8 位和被乘数低 8 位的乘积 部分积 2 为乘数低 8 位和被乘数的高 8 位的乘积 也是 16 位 而且部分积 2 的低 8 位和部 分积 1 的高 8 对齐 高 8 位依次往前放 然后是乘数的高 8 位和被乘数的低 8 位 得到部 分积 3 该 16 位的积 3 的高低 8 位分别和部分积 2 的高低 8 位对齐 最后是乘数的高 8 位 和被乘数的高 8 位相乘 得到部分积 4 其低 8 位与部分积 3 的高 8 位对齐 高 8 位依次 往前 最后我们把这些部分积相加 其中终积的低 8 位是部分积 1 的低 8 位 次低 8 位是 三个字节的相加 再就是后面的三个 8 位字节相加 并考虑进位位 最后是终积的最高 8 位 并考虑进位 最终得到一个 32 位的结果 用 4 个 8 位的寄存器来存放此结果 明白这 个基本运算规则 来看看我们这个例子 如何来放数据呢 是不是将这些多个中间字节存 放起来 然后相加的办法 在我们的例子中 不采用这个方法 因为它有一个缺点 即 4 个部分积要占用比较多的工作寄存器 我们采用的方法是 R7 R3 按照乘法规则 低 8 位放在寄存器 A 中 高 8 位放在寄存器 B 中 通过这两寄存器 转存到 R7 和 R5 两个没有用过的寄存器中去 显然 R7 就是终积的最低位的一个字节 R5 是部分积的一部分 做完这个运算 我们来做 R7 R2 结果仍然在 A 和 B 中 刚才我 们已经有部分积在 R5 中 让 R5 和 A 相加 相加后的结果放到 R4 中 作为终积的一部分 并产生一个进位位 进位位和 B 相加 相加结果放到 R5 寄存器中 到这里 我们完成乘 数低 8 位和被乘数的乘积运算结果 它们分别存放在 R7 R4 和 R5 中 下面我们来乘数的 高 8 位与被乘数的 16 位相乘 这时 也是先 R6 R3 乘积结果在 A B 中 让 R4 和 A 相 加 结果放到 R6 中 并产生进位位 R5 和 B 相加 并考虑刚才的进位位 最后得到的结 果放到 R5 中 并将进位位送 F0 为了防止下面的加法进位覆盖 而另外存放 最后 R6 R2 结果在 B 和 A 中 A 与 R5 相加 结果继续放在 R5 中 进位送 ACC 0 最后是 暂存的进位 B 和辅助进位位 ACC 0 相加结果存 R4 最后得到相乘的结果 经过乘 加 乘 加的四个循环过程得到最后的结果 具体的子程序功能设计如下 子程序功能 子程序功能 双字节无符号数相乘双字节无符号数相乘 程序入口 程序入口 R2 R3 为被乘数 为被乘数 R6 R7 为乘数 为乘数 程序出口 程序出口 R4 R5 R6 R7 为乘积为乘积 程序影响 程序影响 A B F0 具体的程序编制如下 DBMUL MOV A R3 MOV B R7 MUL AB R3 R7 得第一次部分积 XCH A R7 原 R7 内容送 A R7 R3R7L 在 R7 中得到乘积 得最低字节 MOV R5 B R5 R3R7H MOV B R2 MUL AB R2 R7 得第二次部分积 ADD A R5 R2R7L R2R7H MOV R4 A R4 和 CLR A ADDC A B R2R7H R2R7L R5 时产生的进位 MOV R5 A R5 和 MOV A R6 MOV B R3 MUL AB R3 R6 得到第三次部分积 ADD A R4 R3R6L R4 XCH A R6 A R6 R6 R3R6L R4 在 R6 中得到乘积的次低 字节 XCH A B A R3R6H B R6 ADDC A R5 R3R6H R5 R3R6L R4 时产生的进位 MOV R5 A R5 和 MOV F0 C F0 进位 MOV A R2 MUL AB R2 R6 得第四次部分积 ADD A R5 R2R6L R3R6H R5 时产生的进位 MOV R5 A 在 R5 中得到终积的次高字节 CLR A MOV ACC 0 C 累加器最高位 进位 MOV C F0 ADDC A B R2R6H F0 ACC 0 MOV R4 A 在 R4 中得到终积的最高字节 RET 具体讲解对照乘法运算规则和具体图例 简要说明该段程序的意思 编制程序的过程是对 单片机指令系统的熟悉过程 也是对过去学习过的相关知识的复习过程 是一种综合能力 的体现 希望同学们尽快熟悉单片机程序的设计过程 第四章 MCS 51 汇编语言程序设计 汇编语言程序设计举例 2 在上一次课中 我们给大家介绍了双字节的乘法运算程序设计 在应用上还有一类程序 设计需要大家注意的 这就是数值转换程序 我们知道计算机处理的都是二进制数 但是 如果要将这些二进制数送往打印机打印时 它所接受的是 ASCII 码 如果送往显示器显示 时 有一类显示器它接收的是十进制数 遇到这样的问题 我们都需要把计算机处理的二 进制数转化为相应的外部设备所能够接受的代码 这样一类转换 我们就称数值转换 那 么这一节课 我们就给大家讲解一下数值转换程序的编制 数值转换程序数值转换程序 数值转换程序一般都采用子程序来完成 即具体的转换功能由子程序完成 由主程序或 上一级的调用程序来做组织数据 安排结果等工作 我们先来看 1 十六进制数转换为 十六进制数转换为 ASCII 码码 ASCII 码又称美国信息交换标准码 一共有 128 个字符 这些字符常作为外部设备 如 打印机 CRT 显示器等的打印码或显示码使用 所以单片机要与这样一些设备交换信息时 输出的应该是 ASCII 码 但由于计算机内部处理的是二进制数或者是十六进制数 因此在 输出前要进行十六进制数到 ASCII 码的转换 对于外部设备送给单片机的 ASCII 码数据 我们也要进行 ASCII 码到十六进制数的转换 单片机的 CPU 才能作进一步的处理 在转 换之前 我们先来看 ASCII 码与十六进制数据之间的关系 码与十六进制数据之间的关系 ASCII 码字符 码字符 00H 7FH ASCII 码字符共 128 个 我们要进行数值转换 就是要找出十六进制的数据到 ASCII 码之 间的关系 ASCII 码与十六进制数据之间的关系 码与十六进制数据之间的关系 0 9 9 30H30H 39H39H A A F F 41H41H 46H46H 我们要进行十六进制数到 ASCII 码的转换 如果计算机处理的数据是 0 9 时 对应的 ASCII 码为 30H 39H 是 A F 时 找到的是 41H 46H 也就是说 如果计算机要把 0 送 给打印机打印的时候 这时 你不能送 0 而是 30H 这样一种转换实际上有很多种方式 转换方法 转换方法 计算法 计算法 0 0 9 9 30H ASCII 30H ASCII 30H30H 39H39H A A F F 30H30H 07H ASCII 07H ASCII 41H41H 46H46H 查表法 查表法 建立建立 ASCII 代码表存入程序存储器中 通过程序将与转换码相对应的代码表存入程序存储器中 通过程序将与转换码相对应的 ASCII 码从表码从表 格中找出格中找出 例例 4 5 在内部 在内部 RAM 的的 hex 单元中存有两位十六进制数 试将其转换为单元中存有两位十六进制数 试将其转换为 ASCII 码 并存码 并存 放于放于 asc 和和 asc 1 两单元中两单元中 我们这样表达 D7 D6 D5 D4 D3 D2 D1 D0 1100001 0 D2 Hex 0011001 0 32H asc 0100010 0 44H Asc 1 假设我们把要转换的十六进制数为 D2 按照要求将十六进制的 2 转换为 ASCII 码的 32H 并放到 asc 单元 十六进制的 D 转换为 ASCII 码的 44H 存放于 44H 单元 下面看程 序编制过程 我们用子程序来完成 子程序子程序 功能 完成堆栈区中功能 完成堆栈区中 SP 所指单元中的低所指单元中的低 4 位数据转换为位数据转换为 ASCII 码 码 入口 待转换数据放入堆栈区中的首地址单元 入口 待转换数据放入堆栈区中的首地址单元 出口 转换后的数据放入堆栈区中的首地址单元出口 转换后的数据放入堆栈区中的首地址单元 子程序如何编写呢 我们来看看这个子程序 子程序 子程序 HASC HASC DEC SP DEC SP POP ACC ANL A 0FH ADD A 7 MOVC A A PC PUSH ACC INC SP INC SP RET ASCTAB DB 0 1 2 3 4 5 6 7 DB 8 9 A B C D E F 或建立的或建立的 ASCII 表 表 30H 31H 32H 33H 34H 35H 36H 37H 38H 39H 41H 42H 43H 44H 45H 46H 首先 用两条堆栈减 1 指令 由于我们的程序是子程序 供主程序或调用程序调用 在调 用我们这个子程序时 要将断点处的地址压入堆栈 故作此操作 利用堆栈进行转换之前 要求先把数据放到堆栈中即 Hex 在调用子程序之前 你要将 该数据放入堆栈区的首地址中 当调用时 硬件又自动将断点的地址压入堆栈 故程序前 两句是为了找到我们的待转换数据 找到后 将它弹回到累加器 ACC 中 用与指令屏蔽 了高 4 位 低 4 位是待转换的数据 把它放到 A 中 加 7 是为了找到待转换数据在 ASCII 代码表中的位置 ASCII 代码表用伪指令 DB 定义 双引号 里面的数据相当于 ASCII 代码 如果你对这个不了解的话 可以用下面一种形式来定义 它们完全相同 如 30H 代 表 ASCII 码的 0 46H 代表 ASCII 码的 F 在表中寻找待转换代码的方法 首先从表的起始地址开始 根据偏移量来进行 为什么加 7 呢 因为程序后面四条指令占用的字节数为 7 加完后利用查表指令 找到后放到 A 中 根据子程序的出口条件 还需要把它送回堆栈中 最后将堆栈指针恢复到调用前的位置 数据的组织工作由主程序来完成 如下 主程序 主程序 MAIN MAIN MOV SP 0F0H PUSH hex ACALL HASC POP asc MOV A hex SWAP A PUSH ACC ACALL HASC POP asc 1 首先设了一个堆栈指针 将待转换的数据按照子程序入口的要求 压入堆栈中 调用该子 程序 完成整个转换工作 然后利用弹出指令 将该数据保存到相应的单元中 这就完成 低 4 位 16 进制数到 ASCII 的转换 然后再将原数放到 A 中 进行高 4 位转换 先在 A 中 高低位交换后 再调用子程序转换 过程同前 这里介绍的编程方法主要是要理解堆栈的 使用 堆栈的概念十分有利 在程序中使用的被转换数据和转换后的数据之间的数据传递 关系 都是用堆栈来进行的 以上介绍的就是十六进制数转换为 ASCII 代码 下面来看 将 ASCII 码转换为十六进制数 应该如何进行呢 2 ASCII 码转换为十六进制数码转换为十六进制数 ASCII 码码 30H 39H ASCII 码 码 30H 0 0 9 9 41H41H 46H 46H ASCII 码 码 37H A A F F 如果外部设备传给计算机数据为 30H 39H 计算机要处理这个数据之前 应该把它转 换为 0 9 如果外部设备传给计算机 41H 46H 数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银行引流推广活动方案
- 焊工考试题 题库及答案
- 共性学法考试题及答案
- 公交操作考试题及答案
- 幼儿园教学教案设计:安全用吸管
- 房产行业考试题及答案
- 企业培训需求分析工具员工成长支持
- 安全健康作业保障承诺书3篇
- 把握文章的内在逻辑:初中语文课文深度解读教案
- 医疗用品购销及设备租赁合同
- 2025至2030年中国密炼机上辅机系统行业投资前景及策略咨询研究报告
- 《T CPSS 1013-2021-开关电源电子元器件降额技术规范》
- 四川省德阳市中江县2024-2025学年九年级上学期期中考试英语试题(无答案)
- 2024年职工职业技能大赛数控铣工赛项理论考试题库-下(多选、判断题)
- 房地产行业市场调查报告
- 资金分析师职业鉴定考试复习题及答案
- 三级筑路工(高级)职业技能鉴定考试题库(含答案)
- 中职英语第三版第一册Unit1-Lesson1-课件
- 窗帘订购合同范本简单
- 人教版:生命生态安全六年级上册教案
- 抖音洗浴按摩足浴商家本地团购短视频直播运营策划方案【抖音本地生活运营】
评论
0/150
提交评论