题目描述:编写汇编语言程序,假设十进制数与十六进制数均不超过两位,将从键盘读入的十进制数(#开头)或十六进制数(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
运行结果