第八章 代码转换 8.1 概述 代码转换是在计算机程序设计中经常碰到的问题。如二进制数与十进制数的转换,ASCII码表示的十进制数与十六进制数之间的转换等等。 代码转换可以用硬件快速实现,但更常用的方法还是用软件的方法来实现。用软件处理代码转换的方法通常有以下两种方法: 1、用查表的办法:这种方法主要用于代码之间的转换关系比较复杂的情况。但码元的数量必须是有限的。

Slides:



Advertisements
Similar presentations
数制 (1) 基数:在一种数制中,只能使用一组固定的数字符号 来表示数目的大小,其使用数字符号的个数,就称为该数 制的基数。其规则是 “ 逢 b 进一 ” ,则称为 b 进制的基数。 十进制( Decimal )的基数是 10 ,,它有 10 个数字符号, 即 0 , 1 , 2 , 3 , 4 ,
Advertisements

新人教版四年级数学上册 笔算除法 森村中心学校 江国飞 1 、口算。 360÷30= 840÷40= 200÷50= 270÷90= 40÷20= ÷40=3600÷19≈30 90÷30=3 900÷31≈30.
BCD码运算的十进制调整指令 专用于对BCD码运算的结果进行调整 包括:AAA、DAA、AAS、DAS、AAM、AAD
输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
微型计算机技术 教 学 指 导(七) 太原广播电视大学 郭建勇.
第10章 DOS功能调用与BIOS中断调用.
第7章 8086/8088汇编语言程序设计 7.1 引言 7.2 顺序程序设计 7.3 分支结构程序设计 7.4 循环结构程序设计
第四章 汇编语言 程序设计 任课教师:王晓甜
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
第3章 80x86汇编语言程序设计(下).
第3章 80x86汇编语言程序设计(中) 时间不够的情况下只讲16位汇编.
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月26日.
清华大学计算机系列教材 IBM—PC汇编语言 程序设计(第二版).
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
第7章 并行接口 7.1 简单并行接口 7.2 可编程并行接口8255A 7.3 键盘接口 7.4 LED显示器接口.
第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第四节 Intel 8253在IBM PC机上的应用.
Assembly Language Programming
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月10日.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
输入输出与中断 主要内容 CPU与外设之间数据传送方式 中断技术 8086中断系统和中断处理.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第4章 8086汇编语言程序设计 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计
第3章 IA-32指令系统 3.1 基本数据类型 3.2 IA-32的指令格式 3.3 IA-32指令的操作数寻址方式
第8章 寻址方式与指令系统.
第4章 汇编语言程序设计 4.1 程序设计语言概述 4.2 汇编语言的程序结构与语句格式 4.3 汇编语言的伪指令
走进编程 程序的顺序结构(二).
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
第 13 章 中断系统.
第六章 算术运算 6.1 十进制数加减运算 在计算机中采用BCD码来表示十进制数。BCD码就是使用四位二进制数表示一位十进制数。
條件處理.
第九章 高级宏汇编语言 9.1 结构 结构就是将逻辑上有一定关系的一组数据,以某种方式组合在一起所形成的数据形式。
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
第10章 可编程外围接口芯片8255A及其应用 10.1 概述 A的工作原理 A的应用举例.
习题3 1、 分别说明下列指令的原操作数和目的操作数各采用什么寻址方式。 设定如下: ①立即寻址 ② ① ②寄存器寻址
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月17日.
第八章 中断系统.
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
College of Computer Science & Technology
6×3= 6×30= 60×30= 14×2= 14×20= 140×2= 25×2= 25×20= 250×20= 算一算 18 28
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
Chapter 7&8 Assembly Programming
数据表示 第 2 讲.
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
大数据搜索挖掘实验室 第五章 子程序设计 张华平 副教授 博士 Website: 大数据搜索挖掘实验室
微机原理与接口技术 西安邮电大学计算机学院 董 梁.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
第五章 循环与分支程序设计 ch5 2019/9/19.
跟我一起学编程系列课程: 第一篇汇编语言 16位汇编.
Presentation transcript:

第八章 代码转换 8.1 概述 代码转换是在计算机程序设计中经常碰到的问题。如二进制数与十进制数的转换,ASCII码表示的十进制数与十六进制数之间的转换等等。 代码转换可以用硬件快速实现,但更常用的方法还是用软件的方法来实现。用软件处理代码转换的方法通常有以下两种方法: 1、用查表的办法:这种方法主要用于代码之间的转换关系比较复杂的情况。但码元的数量必须是有限的。 2、直接转换法:依据转换规律,采用一定的算术运算或逻辑运算进行转换。

8.2 十六进制数的ASCII码与二进制数之间的相互转换 在编制源程序时,常用十六进制数。而从键盘输入时,在计算机中得到的是每个数符的ASCII码。因此需要将这些ASCII码表示的数转换为二进制数。 十六进制的每个数符所对应的ASCII码如下表所示。

1、对于数字符0~9,其ASCII码的低4位就等于对应的二进制值。转换时,只需要将ASCII码的高4位去掉,就是其对应的二进制数。而在二进制数前加上0011B,就是ASCII码。 2、对于数符A~F,各个ASCII码值与对应的二进制数值之差都为37H。 3、对于数符a~f,各个ASCII码值与对应的二进制数值之差都为57H。 因此,对于数符A~F和a~f,转换时,可以将各个ASCII码值减7H后再去掉高4位。

例1 将4位十六进制数的ASCII码分别转换为对应的4位二进制数,然后将它们组合成一个16位长的二进制数。 例如,十六进制数为1A2CH,它的ASCII码的表示形式为: 31H,41H,32H,43H,而对应的二进制数为0001101000101100B 对于数字0~9的ASCII码,将其高4位二进制数去掉,就是对应的二进制数,对应字母A~F或 a~f ,将其ASCII码减去7,则其低4位与对应的4位二进制数相同。再去掉高4位即可。

字母数符子程序流程图 返回主程序 返回主程序 Y N >‘F’? Y Y <‘a’? <‘A’? N Y N CF<=1 返回主程序 CF<=0 数符ASCII码减7 返回主程序

主程序流程图 结 束 开始 输出提示信息 输入4位十六进制数 初始化循环次数、存结果的AX 取一个数符 Y 数符<‘0’? N Y 数符<‘9’? N 清高4位 调用字母数符子程序 N AX左移4位后存结果 数符有效? Y 修改循环次数 N 输出出错信息 循环次数=0? Y 结 束

DATA SEGMENT PROMPT DB 'INPUT HEXADECIMAL (4DIGIT):$' HEX DB 5,0,5DUP(0) BIN DW ? ERR DB 0AH,0DH,'ERROR ! NO-HEXADECIMAL ! $' DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS

COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 HEXBIN:MOV AX,DATA MOV DS,AX LEA DX,PROMPT;显示提示信息 MOV AH,09H INT 21H LEA DX,HEX MOV AH,0AH ;输入4位十六进制数 LEA SI,HEX+2 ;取输入字符首地址 MOV CH,HEX+1 ;取字符数 MOV AX,0 CONV: MOV BL,[SI] ;代码转换 CMP BL,'0' JB ERROR ;<0,出错 CMP BL,'9' JBE BIN1 ;是0-9,转移

CALL HEX1 ;是字母符,调用子程序 JC ERROR ;是错误的字符 BIN1: AND BL,0FH MOV CL,4 SAL AX,CL;空出低4位装新转换的值 OR AL,BL INC SI DEC CH ;转换字符计数 JNE CONV MOV BIN,AX ;存结果 JMP END0 ERROR: MOV BIN,0 LEA DX,ERR MOV AH,09H INT 21H COSEG ENDS END HEXBIN

;判断大小写子程序 HEX1 PROC CMP BL,'F' JA SMALL CMP BL,'A' ; JB ERROR1;<‘A’,出错 JMP OUT1;是十六进制数符A-F SMALL:CMP BL,‘a’ ;小写字母 JB ERROR1;<‘a’,出错 CMP BL,'f' JA ERROR1;>’f’,出错 OUT1: SUB BL,07H ; CLC ;无错误CF<=0 RET ERROR1:STC;设置出错标志CF<=1 HEX1 ENDP END0: MOV AH,4CH INT 21H

8.3 二进制数与十进制数之间的转换 例1 将16位无符号二进制数转换为用ASCII码表示的十进制数 算法分析: 1. 16位无符号二进制数表示的十进制数范围为0—65535,需要分别求出万位、千位、百位、十位和个位的值。 2. 从16位二进制数中能够减10000的次数就是万位的值,剩下的数再用1000去减,这样依次进行下去,直至个位。

DATA SEGMENT BIN1 DW 0110110110101001B CONST DW 10000,1000,100,10 DEC5 DB 5 DUP(0) DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 BINDEC: MOV AX,DATA MOV DS,AX MOV CX,4 ;转换后十进制位数-1 LEA SI,CONST ;常数首址 LEA DI,DEC5 ;取存十进制数ASCII码的首址 MOV AX,BIN1 ;取待转换数 CONV3: MOV BL,0 ;位计数器初始化 LOP1: SUB AX,[SI];试减 JC NEXT ;不够减,转NEXT INC BL ;够减,计数 JMP LOP1

NEXT: ADD AX,[SI];不够减,恢复余数 OR BL,30H ;形成ASCII码 MOV [DI],BL;存结果 INC SI ; 取下一个常数地址 INC SI INC DI ;修改存结果指针 LOOP CONV3 ;继续 OR AL,30H ;形成个位的ASCII码 MOV [DI],AL ;存个位数 MOV AH,4CH INT 21H CODE ENDS END BINDEC

例2 将16位二进制数转换为非组合型BCD码表示的十进制数。 本例中将16位二进制数转换为5位十进制数的方法是:用10去除二进制数,所得余数为十进制数的个位。其商再除以10,所得余数为十位,如此反复,直到商为0。 程序中用循环实现将二进制数转换为十进制数。十进制数的高位存放在高地址单元,低位存放在低地址单元。

DATA SEGMENT BIN16 DW 365AH ;待转换的二进制数 DEC5 DB 5 DUP(0) ;存转换后的十进制数BCD码 DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS

COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 MAIN:MOV AX,DATA MOV DS,AX LEA DI,DEC5 ;取存十进制数个位的单元地址 MOV AX,BIN16 MOV BX,10 LOP: XOR DX,DX DIV BX ;二进制数除10,余数在DX中 MOV [DI],DL ;存1位十进制数 INC DI CMP AX,0 ;商是否为0? JNE LOP ;否,则继续转换 MOV AH,4CH INT 21H COSEG ENDS END MAIN

8.4 十六进制数与BCD码的转换 从键盘上输入一个十六进制数字的ASCII码串,将它转换为十进制数的BCD码表示形式。 其转换过程通常分为两个步骤:先把十六进制数ASCII码转换为二进制数,再将二进制数转换为BCD码。这两个步骤我们在前面的例题中已经学习了。下面学习另一种将二进制数转换为BCD码的方法。 设4位二进制数为a3a2a1a0 ,每个数符ai的取值为0或1。该二进制数对应的十进制数可用以下公式计算: (((0+a3) ×2+a2) ×2+a1) ×2+a0 公式中需要作4次加法和3次乘法。如果是8位二进制数,则需要作8次加法和7次乘法,其余依此类推。

例1 从键盘输入4位十六进制数(它对应的二进制数是补码表示的带符号数),试编制一程序,把它们转换为带符号非组合型BCD码,并在屏幕上显示出来。 DATA SEGMENT PROMPT DB "INPUT HEXADECIMAL(4DIGITS):$' HEXBUF DB 5,0,5 DUP(0) DISP DB 0AH,0DH BCDBUF DB 6 DUP(0),'$' DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS

算法分析: 1、从键盘输入1~4位十六进制数,存放在以HEXBUF+2为首址的4个字节单元中。其中HEXBUF+1单元中为输入的数据个数。 2、将ASCII码表示的4位十六进制数转换为16位二进制数,并暂时存放在BX中; 3、确定十进制数的符号,并把符号(+或-)存放在BCDBUF单元中; 4、对BX中的二进制数采用前述算法转换为十进制数(非组合型BCD码),转换结果存放在以BCDBUF+1为首址的5个字节单元中; 5、把转换结果的5个非组合型BCD码形成相应的ASCII码 6、显示结果。

COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 HEXBCD: MOV AX,DATA MOV DS,AX ;输入1~4位十六进制数 LEA DX,PROMPT ;显示提示信息 MOV AH,09H INT 21H LEA DX,HEXBUF ;输入数据 MOV AH,0AH ;ASCII码转换为16位二进制数并存入BX中 LEA SI,HEXBUF+2 ;取十六进制数ASCII码首址 MOV BX,0 ;暂存二进制数的寄存器清零 MOV CH,HEXBUF+1 ;取输入数据个数 HEX1: MOV AL,[SI] ;取一个十六进制数字符 CMP AL,'9' JBE NUMB ;小于等于‘9’是数字符

SUB AL,07H ;是字母符 NUMB: AND AL,0FH MOV CL,4 SAL BX,CL OR BL,AL INC SI DEC CH JNE HEX1 ;确定十进制数的符号 MOV BCDBUF,'+' TEST BX,8000H JNS PLUS ;是正数 MOV BCDBUF,'-' ;是负数 NEG BX ;求补后变为原码

;将二进制数转换为非组合型BCD码,从二进制;数高位起,进行15次加和乘 PLUS: MOV CH,0FH ; “加乘”运算的次数 LOP0: SHL BX,1 ;最高位二进制数送CF CALL ADDIT ;先加1位二进制数 CALL MULTI ;再乘2 DEC CH JNE LOP0 SHL BX,1 ;加最低位二进制数 CALL ADDIT ;把非组合型BCD码转换为ASCII码形式 LEA DI,BCDBUF+1 MOV CX,5 LOP1: OR BYTE PTR [DI],30H INC DI LOOP LOP1

显示结果 LEA DX,DISP MOV AH,09H INT 21H MOV AH,4CH ;程序结束 ;多字节BCD码加1位二进制数子程序 ADDIT PROC LEA DI,BCDBUF+5 ;从低位开始 MOV CL,5 ;取字节数 ADD1: MOV AL,[DI] ;取BCD码 ADC AL,0 ;加二进制数位(CF) AAA ;十进制数运算校正 MOV [DI],AL ;存BCD码 DEC DI DEC CL JNE ADD1 RET ADDIT ENDP

;多字节BCD码乘2子程序 MULTI PROC LEA DI,BCDBUF+5 ;从低位开始 MOV CL,5 CLC MUL1: MOV AL,[DI] ;取BCD码 ADC AL,AL ;乘2 AAA ;十进制数运算校正 MOV [DI],AL ;存BCD码 DEC DI DEC CL JNE MUL1 RET MULTI ENDP COSEG ENDS END HEXBCD

作业:P160 3