华工微机系统与接口实验(二)
实验二 数码转码编程及程序调试
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)反复试几组数,考查程序的正确性。
(6)参考流程图如图2-2
CODES SEGMENT
ASSUME CS:CODES
START:
MOV AX,0
MOV BX,0
MOV CX,4
MOV DL,10
MOV SI,3500H
MOV BL,[SI]
SUB BL,30H
MOV AL,BL
S:MUL DL
INC SI
MOV BL,[SI]
SUB BL,30H
ADD AX,BX
LOOP S
MOV DI,3510H
MOV [DI],AX
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.将从键盘输入的五位十进制数的ASCII码已存在3500起始的内存单元中。把它转换成BCD码后,再按位分别存入350A起始的内存单元内。若输入的不是十进制的ASCII码,则显示FF.
程序流程图如图2-3
实验步骤
(1)输入程序并检查无误。
(2)在3500~3504H单元存入五位十进制数的ASCII码,即e3500
并输入31,32,33,34,35。
(3)G=2000,运行以上程序。
(4)D350A,显示结果为:0000:350A 01 02 03 04 CC…
(5)反复试几组数,考查程序的正确性。
(6)参考流程图如下
DATAS SEGMENT
ORG 3500H
SOURCE DB 5 DUP(?)
ORG 3510H
RESULT DB 5 DUP(?)
ORG 3520H
COUNT EQU 5
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX, COUNT
MOV SI, OFFSET SOURCE
MOV DI, OFFSET RESULT ;SI,DI都是指针,分别指向初始值和结果
NEXT:
MOV DL, 0FFH ;16进制以字母开头加上0
MOV AL, [SI] ;取SI中的内容保存到AL
CMP AL, 39H ;与9比较(ASCII 39H就是十进制的9)
JG NEXT1 ;有符号大于则跳转
SUB AL, 30H ;取低四位
CMP AL, 0 ;与0比较
JL NEXT1 ;有符号小于则跳转
MOV [DI], AL ;将AL的值赋给[DI]所值的内容
INC DI
INC SI
DEC CX
CMP CX, 0
JNZ NEXT ;不为零则跳转
JE EXIT
NEXT1:
MOV [DI],DL ;如果不是十进制的ASCII则直接赋0FFH给[DI]所指单元
INC DI
INC SI
DEC CX
CMP CX,0
JNZ NEXT
JE EXIT
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
先执行2次 t ,即
MOV AX,DATAS
MOV DS,AX
3.将十六位二进制数转换为ASCII码表示的十进制数。
十六进制数的值域为0~65535,最大可转换为五位十进制数。
实验步骤
(1)输入程序并检查无误。
(2)在3500~3501H单元中存放0C00,运行程序并检查结果,应看到3510~3514H单元中的数依次为3030303132。
(3)参考流程图见图2-4
DATAS SEGMENT
ORG 3500H ;ORG直接设置偏移地址
SOURCE DW 000CH ;键盘输入是记得先输入地位0C再输入高位OO
ORG 3510H
RESULT DB 5 DUP(?)
ORG 3520H
COUNT EQU 5
ORG 3530H
DIVNUM DW 10
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX, SOURCE
MOV CL, COUNT
MOV BX, 4
NEXT:
MOV DX, 0
DIV DIVNUM ;AX中的OC H/10 = 1...2,余数保存到DX
ADD DX, 30H
MOV RESULT[BX], DL ;第一次循环,将32H放到3514,第二次将31H放到3513...
DEC BX
DEC CL
JNZ NEXT ;当CL=00时停止
MOV AH,4CH
INT 21H
CODES ENDS
END START
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 CC`
输入数与结果ASCII码对应顺序相反。
(5)参考流程图如下
DATAS SEGMENT
ORG 3500H
SOURCE DW 203BH
ORG 3510H
RESULT DB 4 DUP(0)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,SOURCE
MOV DI, OFFSET RESULT
MOV CL, 4
NEXT:
MOV AX, DX
AND AX, 0FH ;只保留最低位
CMP AX, 9
JG NEXT2 ;如果大于9,则需+ 7H,(ASCII 37H),否则就+30H
ADD AX, 30H
MOV [DI], AL ;将结果保存到DI指针所指地址
INC DI ;指针指向下一个地址
SHR DX, CL ;右移四位,即去掉最低位,原来的次低位变成最低位,直到DX=0
CMP DX, 0 ;如果DX=0就结束了
JE EXIT
JNE NEXT
NEXT2:
ADD AX, 37H
MOV [DI], AL
INC DI
SHR DX, CL
CMP DX, 0
JE EXIT
JNE NEXT
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
**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
(5)参考流程图见图2-6
DATAS SEGMENT
ORG 3500H
SOURCE DB 01H, 02H, 03H, 04H, 05H, 06, 07H, 08H
ORG 3510H
RESULT DW 4 DUP(0)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV BL, 0AH
MOV CX, 4
MOV DI, OFFSET SOURCE ;指向输入数据的指针
MOV SI, OFFSET RESULT ;指向结果的指针
NEXT:
MOV AL, [DI] ;将指针所指内容赋给AL
MUL BL ;AL乘10保存到BL
INC DI ;指向下个数据
MOV AH, 0 ;没有用到高四位,赋0
ADD AL, [DI]
MOV [SI], AX
INC SI
INC SI ;+2,比如从3510->3512,一个数据为一个字(16位)
INC DI ;指向下一个数据
DEC CX
CMP CX, 0
JNZ NEXT
MOV AH,4CH
INT 21H
CODES ENDS
END START
哎微机太难了硬件太难了!
代码也不会敲!
记录一下,下不为例!