LC-3 将键盘输入的十进制数和十六进制数转换为二进制数表达方式输出

题目描述:编写汇编语言程序,假设十进制数与十六进制数均不超过两位,将从键盘读入的十进制数(#开头)或十六进制数(x开头)转换为二进制数表达形式,并打印。例如,输入x2A,打印00101010;输入#12,打印00001100

流程:

1、输入第一个符号,判断是#还是x,利用BR语句跳转至不同情况

2、求出实际数值,即将ascii码转换为数字后,第一位数乘以相应进制数+第二位数,十六进制数需额外判断字母

3、利用除二取余法,循环求出每位二进制数,并存储

4、打印每位二进制数,输出时需再还原为ascii码

可执行代码

;将输入的十进制和十六进制数转换成二进制数并输出
;十进制数由#开头,十六进制数由x(小写)开头,假设输入均为两位
		.ORIG	X3000
		LD	R1,N35
		IN	
		ADD	R1,R0,R1	;判断是否为#
		BRZ	GETDEC		;进入十进制		
		LD	R2,N85
		ADD	R1,R1,R2	;判断是否为x
		BRZ	GETHEX		;进入十六进制
		BRNZP	END		;均不符合则直接结束
;十进制转二进制
GETDEC		AND	R1,R1,#0	;R1存储十进制形式第一位数
		AND	R2,R2,#0
		ADD	R2,R2,#10	;R2存储循环次数
		IN			;输入第一位数
		LD	R3,N48
		ADD	R0,R0,R3	;将ascii码转换成数字
MULTTEN		ADD	R1,R1,R0	;将第一位数字乘10
		ADD	R2,R2,#-1
		BRZ	MTEND
		BRNZP	MULTTEN		
MTEND		AND	R0,R0,#0
		IN			;输入第二位数
		ADD	R0,R0,R3
		ADD	R1,R1,R0	;得到十进制数
		STI	R1,NUM		;存储实际数值
;进行逐位除法取余
		LD	R5,BINARYNUM	;R5载入存储地址
		ADD	R5,R5,#7	;除二取余结果从后往前,故先指向最后一位
		AND	R6,R6,#0
		ADD	R6,R6,#8	;R6记录循环次数
LOOP1		AND	R2,R2,#0
		ADD	R2,R2,#-2	;2为除数
		AND	R3,R3,#0	;R3存储商
		AND	R4,R4,#0	;R4存储余数
LOOP2		ADD	R1,R1,R2	;R1=R1-R2
		BRN	STORE1		;如果结果小于0,说明除尽
		ADD	R3,R3,#1	;如果未除尽,商+1
		BRNZP	LOOP2		;继续循环
STORE1		ADD	R4,R4,R1	;令R4=R1
		AND	R2,R2,#0
		ADD	R2,R2,#2	;2为除数
		ADD	R4,R4,R2	;将多减一次的结果加回除数,得到余数
		STR	R4,R5,#0	;存储余数
		AND	R1,R1,#0
		ADD	R1,R1,R3	;令被除数变为此次商
		ADD	R5,R5,#-1
		ADD	R6,R6,#-1
		BRZ	OUTPUT		;循环结束则进入输出
		BRNZP	LOOP1
;十六进制转二进制
GETHEX		AND	R1,R1,#0	;R1存储十进制形式第一位数
		AND	R2,R2,#0
		LD	R7,P16
		ADD	R2,R2,R7	;R2存储循环次数
		IN
		LD	R3,N48		;R3存储-48
		ADD	R0,R0,R3	;将ascii码转换成数字
		ADD	R0,R0,#-9	;判断第一位数是否是字母
		BRP	TONUM1		;如果是字母,将其转换为数字
		ADD	R0,R0,#9	;如果不是字母,还原第一位数
		BRNZP	MULT16
TONUM1		ADD	R0,R0,#2	;将字母转换成数字
MULT16		ADD	R1,R1,R0	;将第一位数字乘16
		ADD	R2,R2,#-1
		BRZ	M16END
		BRNZP	MULT16		
M16END		AND	R0,R0,#0
		IN			;输入第二位数
		ADD	R0,R0,R3	;将ascii码转换成数字
		ADD	R0,R0,#-9	;判断第二位数是否是字母
		BRP	TONUM2		;如果是字母,将其转换为数字
		ADD	R0,R0,#9	;如果不是字母,还原第二位数
		BRNZP	TOBIN
TONUM2		ADD	R0,R0,#2
		ADD	R1,R1,R0	;得到十六进制数
		STI	R1,NUM		;存储实际数值
;进行逐位除法取余
TOBIN		LD	R5,BINARYNUM	;R5载入二进制数存储地址
		ADD	R5,R5,#7	;除二取余结果从后往前,故先指向最后一位
		AND	R6,R6,#0
		ADD	R6,R6,#8	;R6记录循环次数,总共8次
LOOP3		AND	R2,R2,#0
		ADD	R2,R2,#-2	;2为除数
		AND	R3,R3,#0	;R3存储商
		AND	R4,R4,#0	;R4存储余数
LOOP4		ADD	R1,R1,R2	;R1=R1-R2
		BRN	STORE2		;如果结果小于0,说明除尽
		ADD	R3,R3,#1	;如果未除尽,商+1
		BRNZP	LOOP2		;继续循环
STORE2		ADD	R4,R4,R1	;令R4=R1
		AND	R2,R2,#0
		ADD	R2,R2,#2	;2为除数
		ADD	R4,R4,R2	;将多减一次的结果加回除数,得到余数
		STR	R4,R5,#0	;存储余数
		AND	R1,R1,#0
		ADD	R1,R1,R3	;令被除数变为此次商
		ADD	R5,R5,#-1	;按照除二取余顺序,地址指针-1
		ADD	R6,R6,#-1	;循环次数-1
		BRZ	OUTPUT
		BRNZP	LOOP3
;输出		
OUTPUT		AND	R1,R1,#0
		ADD	R1,R1,#8	;输出循环次数
		AND	R2,R2,#0
		LD	R2,BINARYNUM	;载入存储二进制数的起始地址
		AND	R3,R3,#0
		LD	R3,P48
OUTPUTLOOP	LDR	R0,R2,#0
		ADD	R0,R0,R3	;将数字转换成ascii码
		OUT
		ADD	R2,R2,#1
		ADD	R1,R1,#-1
		BRZ	END
		BRNZP	OUTPUTLOOP			
END		HALT
;
N35		.FILL	X-23		;#的ascii码为35
N85		.FILL	X-55		;x的ascii码为120,判断时减去35后再减去85
N48		.FILL	X-30	
N16		.FILL	X-10
P48		.FILL	X30
P16		.FILL	X10
NUM		.FILL	X4000		;存储实际数值,便于调试
BINARYNUM	.FILL	X4100		;存储二进制数的地址
.END

运行结果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值