题目描述:
编写汇编语言程序,假设十进制数与十六进制数均不超过两位,将从键盘读入的十进制数(#开头)或十六进制数(x开头)转换为二进制数表达形式,并打印。例如,输入x2A,打印00101010;输入#12,打印00001100
1、输入第一个符号,判断是#还是x,利用BR语句跳转至不同情况
2、求出实际数值,即将ascii码转换为数字后,第一位数乘以相应进制数+第二位数,十六进制数需额外判断字母
3、利用除二取余法,循环求出每位二进制数,并存储
4、打印每位二进制数,输出时需再还原为ascii码
可执行代码
;将输入的十进制和十六进制数转换成二进制数并输出
;十进制数由#开头,十六进制数由x(小写)开头,假设输入均为两位
.ORIG X3000
LD R1,N35
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存储循环次数
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码
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 ;存储二进制数的地址
题目描述:编写汇编语言程序,假设十进制数与十六进制数均不超过两位,将从键盘读入的十进制数(#开头)或十六进制数(x开头)转换为二进制数表达形式,并打印。例如,输入x2A,打印00101010;输入#12,打印00001100流程:1、输入第一个符号,判断是#还是x,利用BR语句跳转至不同情况2、求出实际数值,即将ascii码转换为数字后,第一位数乘以相应进制数+第二位数,十六进制数需额外判断字母3、利用除二取余法,循环求出每位二进制数,并存储4、打印每位二进制数,输出时需再还原为asci
该存储库已弃用,所有新开发都将在此处完成
用C ++编写的可扩展LC-3模拟器。 包括图形用户界面和命令行界面模拟器,汇编器, 和Python自动分级器(示例)[ ]。 主要在Georgia Tech的CS2110中使用。 由Brandon(bwhitehead0308 [AT] gmail [DOT] com)维护。
特别说明让我知道您的学校是否正在使用此处提供的工具的任何部分。 这些工具每学期都会随着新功能的增加或根据学生的反馈进行调整而有所变化。 我不想破坏任何人的设置,并希望通过更改和建议功能使用户保持循环。
complx是一套用于学习lc3汇编的教育工具。 它包括基于gui和cli的模拟器(分别命名为complx和comp),汇编器(as2obj),通过pyLC3进行的python绑定以及以python编写的autograder框架。 Complx还可以通过为L
不同进制间转换一直是汇编语言必须要掌握的编程技巧,算法也比较简单:
例如:当其他进制数转为十进制时使用的除十取余法,压入栈中,弹出后实现逆序输出;
当其他进制数转为二进制时使用的除二取余法,压入栈中,弹出后实现逆序输出;
进而扩展:当其他进制数转为R进制时使用的除R取余法,压入栈中,弹出后实现逆序输出;
下面介绍一种比较简便的方法,通过移位指令实现的十进制数到二进制数形式的进制转换程序,
如:十进制0.5转换二进制
首先要明白,十进制小数转二进制仍然为小数,所以二进制左边 为0.xx
0.5 × 2 = 1.0 取整数部分“1”
此时小数...
在 LC-3 中,`sext(pcoffset9)`是一个符号扩展操作,用于将 9 位偏移量符号扩展为 16 位。该操作用于计算相对于当前指令地址的偏移量,并将其添加到当前指令地址以计算分支目标地址。
具体来说,偏移量取自当前指令的后 9 位,表示一个有符号的二进制数。如果偏移量的最高位为 1,则表示这是一个负数。符号扩展操作会将这个负数的符号位扩展为 16 位,即将最高位的 1 填充到高位,以得到一个 16 位的有符号数。这个有符号数再与当前指令地址相加,得到分支目标地址。
CSDN-Ada助手:
树结构转换(先序转双亲)
CSDN-Ada助手: