微机实验报告4 数码转换程序实验

     

班级  软件工程16-1  学号  3162052051116  姓名  张识虔  同组实验者              

实验名称             数码转换程序实验                     日期 2018 11 14

一、实验目的:

掌握不同进制数及编码相互转换的程序设计方法

二、实验环境:

PC 微机一台、TD-PITD 实验系统一套。

三、实验内容:

 

计算机输入设备输入的信息一般是由 ASCII 码或 BCD 码表示的数据或字 符,CPU 一般均用二进制数进行计算或其他信息处理,处理结果的输出又必须 依照外设的要求变为 ASCII 码、BCD 码或七段显示码等。因此,在应用软件中, 各类数制的转换和代码的转换是必不可少的。计算机与外设间的数码对应关系如 2-3-1 所示。数码转换关系如图 2-3-1 所示。

 

2-3-1  计算机与外设间的数码转换关系

 

2-3-1  数码转换对应关系

 

  1. ASCII 码表示的十进制数转换为二进制数

 

本实验要求将缓冲区中的一个五位十进制数 00012 ASCII 码转换成二进 制数,并将转换结果显示在屏幕上。转换过程的参考流程如图 2-3-2 所示,根据 流程图编写程序代码。

 

十进制数可以表示为:Dn×10n+Dn-1×10n-1++D0×100=Di×10i 其中 Di 表十进制数 12390

 

上式可以转换为:ΣDi×10i=(((Dn×10+Dn-1)×10)+Dn-2)×10++D1)× 10+D0

 

由上式可归纳十进制数转换为二进制的方法:从十进制数的最高位 Dn 开始 作乘 10 加次位的操作,依次类推,则可求出二进制数结果。

 

2-3-2  十进制 ASCII 转换为二进制数参考流程

 

DATA SEGMENT ;定义源数据段

MSR DB '00012'

LEN EQU $-MSR

DATA ENDS

CODE SEGMENT ;定义代码段

ASSUME CS:CODE, DS:DATA

START: MOV AX, DATA

MOV DS,AX

MOV SI, OFFSET MSR

MOV CX,LEN-1

MOV AL, DS:[SI] ;开始传输数据

MOV AH,0

SUB AX,30H

NEXT1: MOV BX, 0AH

MUL BX ; 将AX中的数乘以10,所得的结果高位保存到DX中,低位保存到AX中

INC SI

MOV DL,DS:[SI]

MOV DH,0

SUB DX,30H ;将数字对应的ASCII码转换成响应的二进制数

ADD AX,DX

DEC CX

JNZ NEXT1

MOV CL,16 ; CL用作循环NEXT2的计数器,因为5位十进制数转化成二进制只有十六位,所以循环次数为16次

MOV BX,AX

NEXT2: ROL BX,1

MOV DL,BL

AND DL,01H

ADD DL,30H ;把BX中的数以二进制形式输出

MOV AH,2H

INT 21H

DEC CL

JNZ NEXT2

MOV AX,4C00H

INT 21H

CODE ENDS

END START

 

 

 

  1. 将十进制数的 ASCII 码转换为 BCD

 

本实验要求将键盘输入的一个五位十进制数 54321 ASCⅡ码存放在数据 区中,转换为 BCD 码后 ,并将转换结果显示于屏幕上 。若输入的不是十进制 数的 ASCⅡ码,则输出“FF”。提示:一字节 ASCⅡ码取其低四位即变为 BCD 码。转换部分的实验流程参见 2-3-3,根据流程图编写程序代码。

  1. 将十六进制数的 ASCII 码转换为十进制数

 

本实验要求将缓冲区中存放的 000CH ASCII 码转换成十进制数,并将转 换结果显示在屏幕上。转换部分的实验流程如图 2-3-4,根据流程图编写程序代 码。

十六位二进制数的值域为 0-65535,最大可转换为五位十进制数。五位十进 制数可表示为:ND=D4×104+D3×103+D2×102+D1×10+D0 因此,将十六位二进 制数转换为五位 ASCⅡ码表示的十进制数,就是求 D1-D4,并将它们转化为 ASC Ⅱ码。

 

2-3-3  十进制 ASCII 转换为 BCD 码数参考流程

 

 

DATA SEGMENT ;定义源数据段

STRING DB 'Input:','$'

MSR DB 6,?,6 DUP(?) ;数据段MSR用于接收从键盘输入的五位十进制数

DATA ENDS

CODE SEGMENT ;定义代码段

ASSUME CS:CODE, DS:DATA

START: MOV AX,DATA

MOV DS,AX ; 装载数据段寄存器

LEA DX, STRING

MOV AH, 09H

INT 21H

MOV DX, OFFSET MSR

MOV AH,0AH

INT 21H

MOV CL,[MSR+1] ;CL中保存实际输入的数据的位数,用于控制循环执行的次数

MOV SI,0002H

MOV BX, OFFSET MSR

NEXT1: MOV AL,[BX+SI] ;开始传输数据

CMP AL,40H

JNC LK1 ;大于等于40H则表明输入的不是数字符,跳到LK1输入F

CLC

CMP AL,30

JC LK1 ;小于30H则表明输入的不是数字字符,到LK1输出字符F

SUB AL,30H

MOV CH,0

PUSH CX

MOV CL,4

MOV DH,AL

SHL DH,CL

NEXT2: ROL DH,1

MOV DL,DH

AND DL,01H

ADD DL,30H

MOV AH,02H

INT 21H

DEC CL

JNZ NEXT2

POP CX

INC SI

DEC CL

JNZ NEXT1

LK1: JZ LK2

MOV DL,46H ;输出字符F

MOV AH,02H

INT 21H

INC SI

DEC CL

JNZ NEXT1

LK2: MOV AX,4C00H

INT 21H

CODE ENDS

END START

 

 

 

2-3-4  将十六进制数的 ASCII 码转换为十进制数参考流程

4BCD 码转换为二进制码 BCD

 

01H,07H,03H,04H,05H,01H,06H,08H,转换成二进制数码存入其后的内存单元中, 转换结束,送屏幕显示。转换部分的实验流程参见 2-3-5,根据流程图编写程序 代码。

 

2-3-5  BCD 码转换为二进制码

 

DATA SEGMENT ;定义源数据段

STRING DB 'Input:','$'

MSR DW 000CH

MDR DB 5 DUP(?),'$'

DATA ENDS

CODE SEGMENT ;定义代码段

ASSUME CS:CODE, DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET MDR

MOV SI, 5

MOV AX,[MSR] ;将数据000CH保存到AX当中

NEXT1: DEC SI

MOV DX,0

MOV CX,0AH

DIV CX

ADD DL,30H

MOV [BX+SI],DL

CMP AX,0

JNE NEXT1

CMP SI,0 ;判断SI是否为零,为零则表明五位十进制数的每一位都不为零,否则应给前面为零的位上补上零

JE NEXT3

NEXT2: DEC SI

MOV AL,30H

MOV [BX+SI],AL

CMP SI,0

JNE NEXT2

NEXT3: MOV DX,OFFSET MDR

MOV AH,09H

INT 21H

MOV AX,4C00H

INT 21H

CODE ENDS

END START

 

 

2.3.4 实验步骤 (1) 按照各实验要求分别编写实验程序。

 (2) 对实验程序进行编译、链接。

(3) 使用调试功能调试程序,观察在调试过程中,程序指令执行之后各寄存 器及数据区的内容。

 (4) 更改数据区中的数据,反复测试,验证程序功能。

 

 

四、心得体会:

 

 

这个是第一次自己手打的实验 的确很难  对汇编语言还不是很熟悉   有时候答案出来了 还不是很理解是怎么转换的  很纠结  

猜你喜欢

转载自blog.csdn.net/qq_41398448/article/details/84331677