题目描述:编写汇编语言程序,假设十进制数与十六进制数均不超过两位,将从键盘读入的十进制数(#开头)或十六进制数(x开头)转换为二进制数表达形式,并打印。例如,输入x2A,打印00101010;输入#12,打印00001100
流程:
1、输入第一个符号,判断是#还是x,利用BR语句跳转至不同情况
2、求出实际数值,即将ascii码转换为数字后,第一位数乘以相应进制数+第二位数,十六进制数需额外判断字母
3、利用除二取余法,循环求出每位二进制数,并存储
4、打印每位二进制数,输出时需再还原为ascii码
可执行代码
;将输入的十进制和十六进制数转换成二进制数并输出;十进制数由#开头,十六进制数由x(小写)开头,假设输入均为两位.ORIGX3000LDR1,N35INADDR1,R0,R1;判断是否为#BRZGETDEC;进入十进制LDR2,N85ADDR1,R1,R2;判断是否为xBRZGETHEX;进入十六进制BRNZPEND;均不符合则直接结束;十进制转二进制GETDECANDR1,R1,#0;R1存储十进制形式第一位数ANDR2,R2,#0ADDR2,R2,#10;R2存储循环次数IN;输入第一位数LDR3,N48ADDR0,R0,R3;将ascii码转换成数字MULTTENADDR1,R1,R0;将第一位数字乘10ADDR2,R2,#-1BRZMTENDBRNZPMULTTENMTENDANDR0,R0,#0IN;输入第二位数ADDR0,R0,R3ADDR1,R1,R0;得到十进制数STIR1,NUM;存储实际数值;进行逐位除法取余LDR5,BINARYNUM;R5载入存储地址ADDR5,R5,#7;除二取余结果从后往前,故先指向最后一位ANDR6,R6,#0ADDR6,R6,#8;R6记录循环次数LOOP1ANDR2,R2,#0ADDR2,R2,#-2;2为除数ANDR3,R3,#0;R3存储商ANDR4,R4,#0;R4存储余数LOOP2ADDR1,R1,R2;R1=R1-R2BRNSTORE1;如果结果小于0,说明除尽ADDR3,R3,#1;如果未除尽,商+1BRNZPLOOP2;继续循环STORE1ADDR4,R4,R1;令R4=R1ANDR2,R2,#0ADDR2,R2,#2;2为除数ADDR4,R4,R2;将多减一次的结果加回除数,得到余数STRR4,R5,#0;存储余数ANDR1,R1,#0ADDR1,R1,R3;令被除数变为此次商ADDR5,R5,#-1ADDR6,R6,#-1BRZOUTPUT;循环结束则进入输出BRNZPLOOP1;十六进制转二进制GETHEXANDR1,R1,#0;R1存储十进制形式第一位数ANDR2,R2,#0LDR7,P16ADDR2,R2,R7;R2存储循环次数INLDR3,N48;R3存储-48ADDR0,R0,R3;将ascii码转换成数字ADDR0,R0,#-9;判断第一位数是否是字母BRPTONUM1;如果是字母,将其转换为数字ADDR0,R0,#9;如果不是字母,还原第一位数BRNZPMULT16TONUM1ADDR0,R0,#2;将字母转换成数字MULT16ADDR1,R1,R0;将第一位数字乘16ADDR2,R2,#-1BRZM16ENDBRNZPMULT16M16ENDANDR0,R0,#0IN;输入第二位数ADDR0,R0,R3;将ascii码转换成数字ADDR0,R0,#-9;判断第二位数是否是字母BRPTONUM2;如果是字母,将其转换为数字ADDR0,R0,#9;如果不是字母,还原第二位数BRNZPTOBINTONUM2ADDR0,R0,#2ADDR1,R1,R0;得到十六进制数STIR1,NUM;存储实际数值;进行逐位除法取余TOBINLDR5,BINARYNUM;R5载入二进制数存储地址ADDR5,R5,#7;除二取余结果从后往前,故先指向最后一位ANDR6,R6,#0ADDR6,R6,#8;R6记录循环次数,总共8次LOOP3ANDR2,R2,#0ADDR2,R2,#-2;2为除数ANDR3,R3,#0;R3存储商ANDR4,R4,#0;R4存储余数LOOP4ADDR1,R1,R2;R1=R1-R2BRNSTORE2;如果结果小于0,说明除尽ADDR3,R3,#1;如果未除尽,商+1BRNZPLOOP2;继续循环STORE2ADDR4,R4,R1;令R4=R1ANDR2,R2,#0ADDR2,R2,#2;2为除数ADDR4,R4,R2;将多减一次的结果加回除数,得到余数STRR4,R5,#0;存储余数ANDR1,R1,#0ADDR1,R1,R3;令被除数变为此次商ADDR5,R5,#-1;按照除二取余顺序,地址指针-1ADDR6,R6,#-1;循环次数-1BRZOUTPUTBRNZPLOOP3;输出OUTPUTANDR1,R1,#0ADDR1,R1,#8;输出循环次数ANDR2,R2,#0LDR2,BINARYNUM;载入存储二进制数的起始地址ANDR3,R3,#0LDR3,P48OUTPUTLOOPLDRR0,R2,#0ADDR0,R0,R3;将数字转换成ascii码OUTADDR2,R2,#1ADDR1,R1,#-1BRZENDBRNZPOUTPUTLOOPENDHALT;N35.FILLX-23;#的ascii码为35N85.FILLX-55;x的ascii码为120,判断时减去35后再减去85N48.FILLX-30N16.FILLX-10P48.FILLX30P16.FILLX10NUM.FILLX4000;存储实际数值,便于调试BINARYNUM.FILLX4100;存储二进制数的地址.END
运行结果