资源描述
王金龙——第二次微机实验、
精品资料
微机原理与接口技术实验
实验名称:数码转码编程及程序调试
学 院 电子与信息学院
专业班级 电子类联合班
学生姓名 王金龙
学生学号 201430260419
实验日期 2016年4月20日
一.实验目的
1.掌握不同进程数及编码相互转换的程序设计方法,加深对数码转换的理解;
2.进一步熟悉键盘使用方法;
3. 进一步熟悉调试程序的方法。
二. 实验设备
装有汇编软件的IBMPC 机一台
三. 实验内容及步骤
计算机输入设备输入的信息一般ASCII码或BCD码表示的数据或字符,CPU处理信息一般均用二进制数进行计算或其它处理,处理结果输出的外设有必须一外设的要求变为ASCII码,BCD码或七段显示码等。因此,在应用软件中各累数制的转换和代码的转换是必不可少的。
计算机于外设间的数码转换关系如图2-1所示,数码对应关系如表2-1所示。
1. 将ASCII码表示的十进制数转换为二进制数
十进制数可表示为:
代表十进制1,2,3,···9,0;
由式(2)可归纳十进制数转换为二进制数的方法:从十进制的最高位Dn开始作乘10加次位的操作,将结果再乘10再加下一个次位,如此重复,则可求出二进制的数结果来。程序流程图如图2-2。这里我们规定:被转换的ASCII码十进制数存放在3500h~3504h单位中。而转换结果在3510~3511单位中.
实验步骤
(1) 输入程序并检查无误。
(2) 在3500~3504h单元存入十进制12的ASCII码,即e3500,并输入3030303132。
(3) g=2000,运行程序,并用CTR+C来中断程序返回监控态。
(4) 用d3510查看结果,应为3510 0C 00
(5) 反复试几组数,考查程序的正确性。
实验流程图如下:
代码和运行结果:
DATA SEGMENT
ORG 3500H
X DB '0' ,'1' ,'2', '3' ,'4' //初始化数据
DATA ENDS //定义数据段
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX , DATA
MOV DS , AX
MOV AX , 0
MOV CX , 05H //定义循环次数
MOV DI , 3500H //表明地址偏移量
MOV BX , 0AH //十进制数10
MOV DH,00H
MOV DL,DS:[DI] //取数
SUB DL, 30H
NEXT: MUL BX
MOV DL,DS:[DI]
SUB DL, 30H
ADD AX,DX
INC DI
LOOP NEXT //代码循环,直到寄存器CX值为0
MOV DS:[3510H],AX //存储最后结果
CODE ENDS
END START
END
实验结论:我在3500~3504h单元存入十进制数1234的ASCII码,在3510h单元存储的结果是04D2,与理论结果一样。
2将从键盘输入的五位十进制数的ASCII码已存在3500起始的内存单元中。把它转换成BCD码后,再按位分别存入350A起始的内存单元内。若输入的不是十进制的ASCII码,则显示FF.
实验步骤:
(1) 输入程序并检查无误。
(2) 在3500~3504H单元存入五位十进制数的ASCII码,即e3500
并输入31,32,33,34,35。
(3) G=2000,运行以上程序。
(4) D350A,显示结果为:0000:350A 01 02 03 04 CC…
(5) 反复试几组数,考查程序的正确性。
实验流程图如下:
代码和运行结果:
ASSUME CS:CODE
CODE SEGMENT
START:MOV SI,3500H
MOV DI,350AH
MOV BX,0009H
MOV CX,0005H
MOV AH,00
L:MOV AL,[SI]
SUB AL,30H
JS FALSE
CMP BL,AL
JS FALSE
TRUE:MOV [DI],AL
JMP NEXT
FALSE:MOV AL,0FFH
MOV [DI],AL
NEXT:INC DI
INC SI
LOOP L
INT 3
CODE ENDS
END START
我们如果输入:31 32 33 34 35,输出01 02 03 04 05,可见输出结果正确。
我们如果输入:31 40 29 30 36,输出01 FF FF 00 06,可见输出结果正确。
3.将十六位二进制数转换为ASCII码表示的十进制数。
十六进制数的值域为0~65535,最大可转换为五位十进制数。
实验步骤
(1) 输入程序并检查无误。
(2) 在3500~3501H单元中存放0C00,运行程序并检查结果,应看到3510~3514H单元中的数依次为3030303132。
实验流程图如下:
代码和运行结果:
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK
ORG 2000H
START:
MOV SI,3500H
MOV BX,0
MOV DI,3515H
MOV AL,[SI]
MOV AH,[SI+1]
MOV DX,0
MOV BX,0AH
PRO1: DEC DI
DIV BX
ADD DL,30H
MOV [DI],DL
MOV DX,0
CMP AX,0
JNE PRO1
PRO2: CMP DI,3510H
JE EXIT
DEC DI
MOV DL,30H
MOV [DI],DL
JMP PRO2
EXIT: MOV AX,4C00H
INT 21H
CODE ENDS
END START
我们如果输入0C00,在3510处开始看到:30 30 30 31 32
我们如果输入10 12,在3510处开始看到:30 34 36 32 34
实验结论:程序执行结果和理论值相符
4. 十六进制数转换为ASCII码
设经过CPU处理后的十六进制存放在起始地址为3500H的内存中,把它们转换成ASCII码之后,再分别存入起始地址为3510的内存单元中。参考流程图如图2-5所示。
实验步骤
(1) 输入程序并检查无误。
(2) 在3500~3501H单元中存入四位16进制数203B,即:e3500,并输入3B,20。
(3) G=2000,运行程序
(4) D350A,显示结果为:
0000:350A 42 33 30 32 `
输入数与结果ASCII码对应顺序相反
实验流程图如下:
实验代码和结果:
DATAS SEGMENT
COUNT EQU 4
ORG 3500H
HEX DW 203BH
ORG 3510H
RES DB 4 DUP(?)
DATAS ENDS
STACKS SEGMENT
DW 50 DUP(?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,HEX //将待转换的16进制数放在DX寄存器中
MOV SI,OFFSET RES //目标地址放在SI寄存器中
MOV CX,COUNT
TRAN:
MOV AX,DX //将16进制数装载到AX寄存器中
AND AX,000FH //取出低四位
CMP AL,9 //与9作比较
JA VOCAB
CMP AL,0 //与0作比较
JB VOCAB
MOV BL,30H //若为0到9的数字
ADD BL,AL
JMP NEXT
VOCAB:
MOV BL,41H //若为字母,则进行以下处理
SUB AL,0AH
ADD BL,AL
NEXT:
MOV [SI],BL //将转换后的值存入目标地址中
INC SI
MOV BL,4 //将16进制数右移4位
XCHG BL,CL
SHR DX,CL
XCHG BL,CL
LOOP TRAN
MOV AH,4CH
INT 21H
CODES ENDS
END START
存储单元初始值为3B20,程序运行后结果为:
如果将存储单元的初始值修改为5F34,则程序运行结果如下:
5题实验流程图
5. BCD码转换为二进制码
设四个二位十进制的BCD码存放在起始地址为3500H的单元中,转换出的二进制数码存入起始为3510的内存单元中,程序流程图如图2-6。
实验步骤:
(1) 输入程序并检查无误
(2) 在3500~3501H单元中存入四个十进制数(12,34,56,78)的BCD码,即e3500,输入01.02.03.04.05.06.07.08。
(3) G=2000,运行程序
(4) D3510,显示结果为3510 0C 00 22 00 38 00 4E 00
实验代码和结果:
DATA SEGMENT
ORG 3500H
BUF DB 100 dup(0);
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV CX,4
LEA DI,BUF
LEA SI,BUF+10H;存转化后的数
MOV BL ,10
LCW: MOV AL ,[DI]
MUL BL
INC DI
MOV AH,00H
ADD AL, [DI]
MOV [SI],AL
INC SI
INC SI ;
INC DI
LOOP LCW
EXIT: MOV AX, 4C00H
INT 21H
CODE ENDS
END START
如果我们输入的数据为01,02,03,04,05,06,07,08
图 6-1
如果我们输入的数据为09,08,07,06,05,04,03,02
四. 实验感悟:
学习汇编语言打破了我传统的思维模式,这门语言已不再是以前学C语言和C++语言时那种模式,虽然用汇编语言编写的程序运行速度快,实时性好,占用内存空间小,能最大限度发挥硬件的作用,但汇编语言编写的程序效率低,程序设计的技巧性强,因此他要求编写人员既要熟悉计算机的硬件结构,又要熟悉计算机的指令系统,才有可能编写出高质量的汇编语言程序。
汇编语言学习起来虽然不容易,但是我愿意去探索其中的奥妙,今后汇编语言将成为我打开计算机和互联网的IT世界的敲门砖,我还需要多多努力。
仅供学习与交流,如有侵权请联系网站删除 谢谢17
展开阅读全文