当前位置:文档之家› 北京工业大学微机原理实验九

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

实验九数码转换一、实验目的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 ENDSDATA SEGMENT PARA 'DATA';定义数据段DATA1 DB 32 ; 缓冲区最大长度DBDB 32 DUP()DATA2 DB 32 DUP()DATA ENDSCODE SEGMENT; 定义代码段ASSUME SS:STACKASSUME CS:CODEASSUME DS:DATASTART: MOV AX,DATAMOV DS,AXLEA DX,DATA1 ; 规定:DX存放输入字符串的缓冲区首地址MOV AH,0AHINT 21H ; 字符串输入AL=键入的ASCII码LEA SI,DATA1LEA DI,DATA2 ; DI存放DATA2首地址INC SIMOV CH,0MOV CL,[SI] ; 取输入字符串长度INC SI ; 指向第一个输入字符LP1:MOV AL,[SI]SUB AL,30H ; 输入的字符存为ASCII码,将其转换成十进制数CMP AL,0 ; 若AL<0(AL-0<0),跳转到LP2JL LP2CMP AL,9 ; 若AL>9(AL-9>0),跳转到LP2JG LP2MOV BL,AL ; 将AL->BLMOV [DI],BL ; 将结果存到DATA2开始的单元中INC DIINC SIDEC CLJMP LP1LP2:MOV AL,0FFH ; 若输入的不是十进制数,在相应的单元存放FFH; 以字母开头的十六进制数前面需加'0'MOV BL,AL ; 将AL->BLMOV [DI],BLINC DIINC SICMP CL,0JNZ LP1 ; CL=0,执行LP3中的语句LP3:MOV AH,4CHINT 21HCODE ENDSEND START2. BCD码转换为二进制码DATA SEGMENTDATA1 DW 2497HDATA2 DWDATA ENDSCODE SEGMENTASSUME CS:CODEASSUME DS:DATASTART:MOV AX,DATAMOV DS,AXXOR BX,BX ;累加单元清0(BX=0)MOV SI,0AH ;设置乘数10MOV CL,4 ;指4位BCD码MOV CH,3 ;循环次数=3MOV AX,DATA1 ;取十进制数LP:ROL AX,CL ;取数字MOV DI,AX ;保存当前AX值AND AX,0FH ;屏蔽高位ADD AX,BX ;累加MUL SIMOV BX,AXMOV AX,DIDEC CH ;循环次数减1JNZ LP ;以上完成循环三次,个位不用再*10,所以不用最后不用放入循环中去ROL AX,CL ;取个位数字AND AX,0FH ;屏蔽高位ADD AX,BX ;进行累加,直接将最后的累加结果放到AX中MOV DATA2,AXMOV AH,4CHINT 21HCODE ENDSEND START3. 十六进制数转换为ACSII码STACK SEGMENTDB 256 DUP()STACK ENDSDATA SEGMENTDATA1 DB 24H,06DHDATA2 DB 4 DUP() ; 存放ASCII码JUMP DB 4 DUP() ; 4位十六进制数分别存放在DATA3的4个字节中DATA ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODESTART:MOV AX,DATAMOV DS,AXLEA SI,DATA1LEA DI,JUMPMOV CH,2 ; 循环2次,取两次两位十六进制数LP0:MOV AL,[SI] ; 取2位十六进制数AND AL,0F0H ; 低四位为零MOV CL,4ROR AL,CL ; 右移4位相当于除以16 MOV [DI],AL ; 高位数存放在高地址字节中INC DIMOV AL,[SI] ; 取2位十六进制数AND AL,0FH ; 高四位为零MOV [DI],AL ; 低位数存放在低地址字节中INC SIINC DIDEC CHJNZ LP0LEA SI,JUMP ; SI=JUMP的首地址偏移量LEA DI,DATA2 ; DI=DATA2的首地址偏移量MOV CH,4 ; 因为是四位十六进制数,所以设置为循环4次LP1:MOV AL,[SI] ; 取JUMP中的十六进制数CMP AL,9JG LP2 ; 若AL>9(AL-9>0),跳转到LP2ADD AL,30H ; 0~9H+30H=ASCII JMP LP3LP2:ADD AL,37H ; A~FH+30H=ASCII LP3:MOV [DI],AL ; 将ASCII码依次存入DATA2中INC DIINC SIDEC CHJNZ LP1MOV AH,09HINT 21HMOV DX,OFFSET DATA2MOV AH,09HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START六、实验习题与思考1. 编程实现:从键盘上输入两位十六进制数,转换成十进制数后显示在屏幕上。

STACK SEGMENTDB 256 DUP()STACK ENDSDATA SEGMENTDATA1 DB 5,,2 DUP()DATA2 DB 2 DUP()DATA3 DB 2 DUP()DATA ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODESTART:MOV AX,DATAMOV DS,AXLEA DX,DATA1MOV AH,0AHINT 21H ;输入字符串LEA SI,DATA1+2LEA DI,DATA2MOV CL,2 ;将ASC码转换为十六进制数LP1: MOV AL,[SI]SUB AL,30HCMP AL,9JA LP2MOV [DI],ALINC DIINC SIDEC CLJZ LP3JNZ LP1LP2: SUB AL,7MOV [DI],ALINC DIINC SIDEC CLJNZ LP1 ;将十六进制数转换成十进制数,并保存LP3: LEA DI,DATA2MOV AL,[DI]MOV BL,[DI+1]MOV CL,4SHL AL,CLADD AL,BLMOV [DI],ALLEA SI,DATA3XOR AH,AHMOV CL,100DIV CL ;AH=AX%100,AL=AX/100MOV [SI],AL ;保存百位数MOV AL,AHXOR AH,AHMOV CL,10DIV CLMOV [SI+1],AL ;保存十位数MOV [SI+2],AH ;保存个位数 ;屏幕显示十进制数LP4: MOV DL,[SI] ;取百位数送显OR DL,30HMOV AH,02HINT 21HMOV DL,[SI+1] ;取十位数送显OR DL,30HMOV AH,02HINT 21HMOV DL,[SI+2] ;取个位数送显OR DL,30HMOV AH,02HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START2. 十进制数转换为七段码。

为了在七段显示器上显示十进制数,需要把十进制数转换为七段代码。

转换可采用查表法。

设需要转换的十进制数已存放在起始地址为DATA1区域中,七段代码转换表存放在起始地址为TABLE表中,转换结果存放到起始地址为DATA2区域。

若待转换的数不是十进制数,则相应结果单元内容为00H。

STACK SEGMENTDB 256 DUP()STACK ENDSDATA SEGMENTDATA1 DB 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,'A','B','C','$'TABLE DB 00H,40H,01H,79H,02H,24H,03H,30H,04H,19H,05H,12H,06H,02H,07H,78H,08H,00H,09H,18H,0AH,08H,0BH,03H,0CH,46H,0DH,21H,0EH,06H,0FH,0EH ;实际数据定义必须在同一行DATA2 DB 16 DUP(0)COUNT EQU 2DATA ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODESTART: MOV AX,DATAMOV DS,AXLEA SI,DATA1LEA BX,DATA2LEA DI,TABLEXOR AH,AHLP1: MOV AL,[SI] ;外循环DATA1指向下一个INC SIMOV CX,16 ;内循环TABLE 16次LP2: CMP [DI],ALJE LP3ADD DI,COUNT ;内循环TABLE指向下一组DEC CXJNZ LP2MOV BYTE PTR[BX],00H 若不是十进制数,则结果保存为00H INC BXCMP AL,'$' ;设置结束标志JNZ LP1JZ LP4LP3: MOV AL,[DI+1]MOV [BX],AL ;转换结果保存在DATA2中INC BXLEA DI,TABLECMP CL,0JNZ LP1LP4: MOV AH,4CHINT 21HCODE ENDSEND START。

相关主题