北京工业大学微机原理实验九

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验九数码转换

一、实验目的

1、掌握计算机常用数据编码之间的相互转换方法。

2、进一步熟悉DEBUG软件的使用方法。

二、实验内容

1. ACSII码转换为非压缩型BCD码

编写并调试正确的汇编语言源程序,使之实现:设从键盘输入一串十进制数,存入DATA1单元中,按回车停止键盘输入。将其转换成非压缩型(非组合型) BCD码后,再存入DATA2开始的单元中。若输入的不是十进制数,则相应单元中存放FFH。调试程序,用D命令检查执行结果。

2. BCD码转换为十六进制码

编写并调试正确的汇编语言源程序,使之将一个16位存储单元中存放的4位BCD码DATA1,转换成十六进制数存入DATA2字单元中。调试程序,用D命令检查执行结果。

3. 十六进制数转换为ASCII码

编写并调试正确的汇编语言源程序,使之将内存DATA1字单元中存放的4位十六进制数,转换为ASCⅡ码后分别存入DATA2为起始地址的4个单元中,低位数存在低地址的字节中,并在屏幕上显示出来。

三、实验预习

1. 复习材料中有关计算机数据编码部分的内容。

2. 按要求编写程序。

四、实验步骤

1. 编辑源文件,经汇编连接产生EXE文件。

2. 用DEBUG调试、检查、修改程序。

五、实验内容

1. ACSII码转换为非压缩型BCD码

STACK SEGMENT PARA STACK 'STACK'

DB 256 DUP() ; 为堆栈段留出256个字节单位

STACK ENDS

DATA SEGMENT PARA 'DATA';定义数据段

DATA1 DB 32 ; 缓冲区最大长度

DB

DB 32 DUP()

DATA2 DB 32 DUP()

DATA ENDS

CODE SEGMENT; 定义代码段ASSUME SS:STACK

ASSUME CS:CODE

ASSUME DS:DATA

START: MOV AX,DATA

MOV DS,AX

LEA DX,DATA1 ; 规定:DX存放输入字符串的缓冲区首地址

MOV AH,0AH

INT 21H ; 字符串输入

AL=键入的ASCII码

LEA SI,DATA1

LEA DI,DATA2 ; DI存放DATA2首地址

INC SI

MOV CH,0

MOV CL,[SI] ; 取输入字符串长度

INC SI ; 指向第一个输入字符

LP1:

MOV AL,[SI]

SUB AL,30H ; 输入的字符存为ASCII码,将其转换成十进制数

CMP AL,0 ; 若AL<0(AL-0<0),跳转到LP2

JL LP2

CMP AL,9 ; 若AL>9(AL-9>0),跳转到LP2

JG LP2

MOV BL,AL ; 将AL->BL

MOV [DI],BL ; 将结果存到DATA2开始的单元中

INC DI

INC SI

DEC CL

JMP LP1

LP2:

MOV AL,0FFH ; 若输入的不是十进制数,在相应的单元存放FFH

; 以字母开头的十六进制数前面需加'0'

MOV BL,AL ; 将AL->BL

MOV [DI],BL

INC DI

INC SI

CMP CL,0

JNZ LP1 ; CL=0,执行LP3中的语句

LP3:

MOV AH,4CH

INT 21H

CODE ENDS

END START

2. BCD码转换为二进制码

DATA SEGMENT

DATA1 DW 2497H

DATA2 DW

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE

ASSUME DS:DATA

START:

MOV AX,DATA

MOV DS,AX

XOR BX,BX ;累加单元清0(BX=0)

MOV SI,0AH ;设置乘数10

MOV CL,4 ;指4位BCD码

MOV CH,3 ;循环次数=3

MOV AX,DATA1 ;取十进制数

LP:

ROL AX,CL ;取数字

MOV DI,AX ;保存当前AX值

AND AX,0FH ;屏蔽高位

ADD AX,BX ;累加

MUL SI

MOV BX,AX

MOV AX,DI

DEC CH ;循环次数减1

JNZ LP ;以上完成循环三次,个位不用再*10,所以不用最后不用放入循环中去

ROL AX,CL ;取个位数字

AND AX,0FH ;屏蔽高位

ADD AX,BX ;进行累加,直接将最后的累加结果放到AX中

MOV DATA2,AX

MOV AH,4CH

INT 21H

CODE ENDS

END START

3. 十六进制数转换为ACSII码

STACK SEGMENT

DB 256 DUP()

STACK ENDS

DATA SEGMENT

DATA1 DB 24H,06DH

DATA2 DB 4 DUP() ; 存放ASCII码

JUMP DB 4 DUP() ; 4位十六进制数分别存放在DATA3的4个字

节中

DATA ENDS

CODE SEGMENT

ASSUME SS:STACK,DS:DATA,CS:CODE

START:

MOV AX,DATA

MOV DS,AX

LEA SI,DATA1

LEA DI,JUMP

MOV CH,2 ; 循环2次,取两次两位十六

进制数

LP0:

MOV AL,[SI] ; 取2位十六进制数

AND AL,0F0H ; 低四位为零

MOV CL,4

ROR AL,CL ; 右移4位相当于除以16 MOV [DI],AL ; 高位数存放在高地址字节

INC DI

MOV AL,[SI] ; 取2位十六进制数

AND AL,0FH ; 高四位为零

MOV [DI],AL ; 低位数存放在低地址字节

INC SI

INC DI

DEC CH

JNZ LP0

LEA SI,JUMP ; SI=JUMP的首地址偏移量

LEA DI,DATA2 ; DI=DATA2的首地址偏移

MOV CH,4 ; 因为是四位十六进制数,所以设

置为循环4次

相关文档
最新文档