欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华工微机系统与接口实验(二)

程序员文章站 2022-03-15 14:04:01
...

实验二 数码转码编程及程序调试

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

华工微机系统与接口实验(二)

哎微机太难了硬件太难了!
代码也不会敲!
记录一下,下不为例!

相关标签: 微机系统与接口