我们已获得计算机系统基础课程的作业。该程序的目标是以三种不同的方式显示无符号整数值:二进制,十进制和十六进制。我已经完成了二进制的部分,十进制方法只需要除以10并打印结果。但是,对于十六进制,教授希望我们使用圆形左移来实现它(为了执行左旋转)。
IE。
0010 1111 0000 1001
+ 0010 1111 0000 1001
--------------------
0101 1110 0001 0010
我们必须这样做4x然后应用一个掩码来清除[15:4]中的所有位,以便打印出位[3:0]的ascii值。
这是我解决这个程序的算法。
;Loop 4 times -->initialization of for loop
;Begin For Loop
;Perform the left shift
;If the value after the left shift is performed has a carry of 1
;then add 1 to this value (the rotation)
;Otherwise if the value after the left shift is performed has a carry of 0
;Continue the value is already rotated
;Get the value of the number after the loop has completed
;Create a new loop that will go through the Digits
;Load R0 with the value of the digit that we land on
;Print that value to the screen
我遇到的问题是我不知道如何找到被移位的数字的进位。
例如:0000 0000 0001 1011 ----> bit[4] is the carry bit after the left shift
我不知道如何跟踪它以执行循环移位。 我尝试了一个
的面具1000 0000 0000 0000
但我不这么认为 跟踪位[15]上没有发生的任何进位。
帮助将不胜感激,本书没有提供示例,我在网上找不到任何来源,我知道回答作业问题通常不赞成,但我在我的智慧结束!这个周末所以我不能联系教授,这项任务很快就会到期(不是最后一刻,我从星期五起就一直坚持这个-_-)。
谢谢!
编辑:更多信息
DIGITS是这样的:DIGITS .STRINGZ "0123456789ABCDEF" ;Digit_String
它将在4次旋转后取[3:0]的值,并确定打印出哪个ascii字符。
答案 0 :(得分:0)
我几乎做同样的任务。我想我实际上有同一类lol。我知道这个网站上的人看不起共享代码,但是你看到的是你遇到麻烦的部分。看看它并尝试适当地追加你的。此外,我遇到了与掩码相同的问题,尝试使用xF000作为掩码来获取MSB(大多数sig字节)。
ST R1, HEX1
ST R7, HEX7
AND R1, R1, 0
AND R7, R7, 0
AND R2, R2, 0
ADD R1, R0, #0
LD R4, HEXMASK
ADD R6, R6, #4; counter 2
OUTERROT
LD R3, INMASK
LD R5, OUTMASK
ST R5, HEXSAVE
LD R5, HEXMASK2
AND R7, R1, R5; R7=MSB
LD R5, HEXSAVE
ADD R2, R2, #4
SHIFT
ADD R1, R1, R1
ADD R2, R2, #-1
BRz EXITSHF
BR SHIFT
EXITSHF
AND R0, R0, 0
ADD R0, R1, 0
AND R1, R1, 0
SHFTR
ST R4, HEXSAVE
AND R4, R4, 0
AND R4, R7, R3
BRz DONOTHING
NOT R1, R1
NOT R5, R5
AND R4, R1, R5
NOT R4, R4
NOT R1, R1
NOT R5, R5
ADD R1, R4, 0
BRz SHFTREX
DONOTHING
LD R4, HEXSAVE
ADD R5, R5, R5
ADD R3, R3, R3
BRz SHFTREX
BR SHFTR
SHFTREX
ADD R0, R1, R0
AND R1, R1, 0
ADD R1, R0, 0
ST R0, HEXSAVE
ST R1, HEXSAVE1
AND R0, R0, 0
AND R0, R1, R4
ST R3, CONV3
AND R3, R3, #0
LEA R3, DIGITS
START
ADD R3, R3, 1
ADD R0, R0, #-1
BRnp START
LDR R0, R3, 0
LD R3, CONV3
TRAP x21
LD R0, HEXSAVE
ADD R6, R6, #-1
BRz HEXEXIT
BR OUTERROT
HEXEXIT
LD R1, HEX1
LD R7, HEX7
RET
;Save Area
HEXMASK .FILL x000F
HEXMASK2 .FILL XF000
INMASK .FILL x1000
OUTMASK .FILL x0001
ASCII .FILL X0030
HEX1 .BLKW 1
HEX7 .BLKW 1
HEXSAVE1 .BLKW 1
HEXSAVE .BLKW 1
CONV3 .BLKW 1
从未指定过哪个面具。实际上有4个掩码用于右移MSB,1用于获得MSB,1用于最后获得B [3:0]中的位。尝试识别差异。
答案 1 :(得分:0)
之前从未听说过 LC3 所以我不知道指令集,但是你从快速谷歌那里得知:
and,add,not
说明N,Z,P
标志2'os
补充ALU 哪个真的不多(它缺乏基本说明)所以你必须向后做所有事情。但是,有很多方法可以做循环旋转,例如:
r0
左侧的轮播,您可以使用add r0,r0,r0
获取进位可以在旋转前使用值符号
如果设置了 MSB 位,则 in 2' os补码为负数。因此,您需要使用一些中性算术运算和测试N,P
标志来设置标志。例如add r0,r0,#0
另一种方式是您猜到and
MSB 和测试Z
标志,但我不确定您是否可以将1000 0000 0000 0000 bin
存储为正数没有看到有符号和无符号常量之间有任何区别我认为它们都是有符号的,并且将此值设置为正值将溢出编译器/解释器使其很可能为零。尝试使用#-32768
代替。
当放在一起时,请让r0
中的值为:
LD R0,#your value
; extract MSB bit to R1
LD R1,#0 ; hope this is load
ADD R0,R0,#0 ; MSB -> N/P flags
BRp REL0 ; hope this is conditional jump if positive
LD R1,#1 ; carry was set
REL0
; shift
ADD R0,R0,R0 ; shift left (arithmetic)
ADD R0,R0,R1 ; shift left (cyclic)