我正在尝试扩大一个位掩码,但是虽然它在较低的数字下有效,但它在较高的数字下分崩离析
I am trying to scale up a bit mask, but while it works at lower numbers, it falls apart at higher ones
此时,R6 包含一个我想以二进制形式打印出来的整数。
EndLoop
AND R4, R4, #0
ADD R5, R5, R6 ;This moves my INT to R5
AND R1, R1, #0
AND R2, R2, #0
LD R2, Count
NOT R2, R2
ADD R2, R2, 1 ;This is an offset for making sure we only loop 4 times. I changed it to 8 when trying to make the code scale up
WHILELOOP
ADD R3, R1, R2 ;This checks the loop completion
BRz LOOP_END
LEA R3, Mask ;loads the current mask
ADD R3, R3, R1
AND R4, R4, #0
LDR R4, R3, #0
AND R4, R4, R5
BRz NO ;Prints out the 0
LD R0, One
OUT
ADD R1, R1, #1
BRnzp WHILELOOP
NO ;Prints out the 1
LD R0, Zero
OUT
ADD R1, R1, #1
BRnzp WHILELOOP
LOOP_END
LD R0, Newline
OUT
HALT
Mask
; .FILL b0100000000000000 ;This is what I tried to add
; .FILL b0010000000000000
; .FILL b0001000000000000
; .FILL b0000100000000000
; .FILL b0000010000000000
; .FILL b0000001000000000
; .FILL b000000010000000
; .FILL b000000001000000
; .FILL b000000000100000
; .FILL b000000000010000
.FILL b0000000000001000
.FILL b0000000000000100
.FILL b0000000000000010
.FILL b0000000000000001
.FILL b0000000000000000
Newline .FILL x000A
Zero .FILL x0030
One .FILL x0031
Count .FILL x4 ;I changed this to 14 (because 15 masks)
GREETING .STRINGZ "Enter a decimal number:"
NEWLINEVAL .FILL -10 ; '\n' is 10
.END
好的,所以这段代码有效。但是,它只适用于 4 位数字 (0-15)。我希望它适用于 15 位数字,所以我尝试添加您看到的被注释掉的 Mask 并进行我在一些评论中描述的更改。
但是,它不起作用,而且对于我的生活,我无法弄清楚为什么。也许我错过了一些非常愚蠢的东西。我希望这是有道理的,如果没有请问。
谢谢。
以防万一有人想知道,我得到的最接近的是 ADD R2, R2, 8 15 个掩码,并数到 14。例如将 15 放入:0000010001111
这非常接近。
根据评论编辑:
Loop
GETC
OUT
ADD R5,R4,R0 ;This checks for a return
BRz EndLoop
ADD R6, R6, R3 ;This does the math
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R0
ADD R3, R6, #0
BRnzp Loop
循环结束
这在这里工作正常。我不得不更改为十六进制常量,因为我的 lc3 版本显然不支持二进制。
LD R6,input
AND R4, R4, #0
ADD R5, R5, R6 ;This moves my INT to R5
AND R1, R1, #0
AND R2, R2, #0
LD R2, Count
NOT R2, R2
ADD R2, R2, 1
WHILELOOP
ADD R3, R1, R2 ;This checks the loop completion
BRz LOOP_END
LEA R3, Mask ;loads the current mask
ADD R3, R3, R1
AND R4, R4, #0
LDR R4, R3, #0
AND R4, R4, R5
BRz NO ;Prints out the 0
LD R0, One
OUT
ADD R1, R1, #1
BRnzp WHILELOOP
NO ;Prints out the 1
LD R0, Zero
OUT
ADD R1, R1, #1
BRnzp WHILELOOP
LOOP_END
LD R0, Newline
OUT
HALT
Mask
.FILL x4000
.FILL x2000
.FILL x1000
.FILL x0800
.FILL x0400
.FILL x0200
.FILL x0100
.FILL x0080
.FILL x0040
.FILL x0020
.FILL x0010
.FILL x0008
.FILL x0004
.FILL x0002
.FILL x0001
Newline .FILL x000A
Zero .FILL x0030
One .FILL x0031
Count .FILL 15 ;I changed this to 14 (because 15 masks)
GREETING .STRINGZ "Enter a decimal number:"
NEWLINEVAL .FILL -10 ; '\n' is 10
Input .FILL x4321
.END
此时,R6 包含一个我想以二进制形式打印出来的整数。
EndLoop
AND R4, R4, #0
ADD R5, R5, R6 ;This moves my INT to R5
AND R1, R1, #0
AND R2, R2, #0
LD R2, Count
NOT R2, R2
ADD R2, R2, 1 ;This is an offset for making sure we only loop 4 times. I changed it to 8 when trying to make the code scale up
WHILELOOP
ADD R3, R1, R2 ;This checks the loop completion
BRz LOOP_END
LEA R3, Mask ;loads the current mask
ADD R3, R3, R1
AND R4, R4, #0
LDR R4, R3, #0
AND R4, R4, R5
BRz NO ;Prints out the 0
LD R0, One
OUT
ADD R1, R1, #1
BRnzp WHILELOOP
NO ;Prints out the 1
LD R0, Zero
OUT
ADD R1, R1, #1
BRnzp WHILELOOP
LOOP_END
LD R0, Newline
OUT
HALT
Mask
; .FILL b0100000000000000 ;This is what I tried to add
; .FILL b0010000000000000
; .FILL b0001000000000000
; .FILL b0000100000000000
; .FILL b0000010000000000
; .FILL b0000001000000000
; .FILL b000000010000000
; .FILL b000000001000000
; .FILL b000000000100000
; .FILL b000000000010000
.FILL b0000000000001000
.FILL b0000000000000100
.FILL b0000000000000010
.FILL b0000000000000001
.FILL b0000000000000000
Newline .FILL x000A
Zero .FILL x0030
One .FILL x0031
Count .FILL x4 ;I changed this to 14 (because 15 masks)
GREETING .STRINGZ "Enter a decimal number:"
NEWLINEVAL .FILL -10 ; '\n' is 10
.END
好的,所以这段代码有效。但是,它只适用于 4 位数字 (0-15)。我希望它适用于 15 位数字,所以我尝试添加您看到的被注释掉的 Mask 并进行我在一些评论中描述的更改。
但是,它不起作用,而且对于我的生活,我无法弄清楚为什么。也许我错过了一些非常愚蠢的东西。我希望这是有道理的,如果没有请问。
谢谢。
以防万一有人想知道,我得到的最接近的是 ADD R2, R2, 8 15 个掩码,并数到 14。例如将 15 放入:0000010001111 这非常接近。
根据评论编辑:
Loop
GETC
OUT
ADD R5,R4,R0 ;This checks for a return
BRz EndLoop
ADD R6, R6, R3 ;This does the math
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R3
ADD R6, R6, R0
ADD R3, R6, #0
BRnzp Loop
循环结束
这在这里工作正常。我不得不更改为十六进制常量,因为我的 lc3 版本显然不支持二进制。
LD R6,input
AND R4, R4, #0
ADD R5, R5, R6 ;This moves my INT to R5
AND R1, R1, #0
AND R2, R2, #0
LD R2, Count
NOT R2, R2
ADD R2, R2, 1
WHILELOOP
ADD R3, R1, R2 ;This checks the loop completion
BRz LOOP_END
LEA R3, Mask ;loads the current mask
ADD R3, R3, R1
AND R4, R4, #0
LDR R4, R3, #0
AND R4, R4, R5
BRz NO ;Prints out the 0
LD R0, One
OUT
ADD R1, R1, #1
BRnzp WHILELOOP
NO ;Prints out the 1
LD R0, Zero
OUT
ADD R1, R1, #1
BRnzp WHILELOOP
LOOP_END
LD R0, Newline
OUT
HALT
Mask
.FILL x4000
.FILL x2000
.FILL x1000
.FILL x0800
.FILL x0400
.FILL x0200
.FILL x0100
.FILL x0080
.FILL x0040
.FILL x0020
.FILL x0010
.FILL x0008
.FILL x0004
.FILL x0002
.FILL x0001
Newline .FILL x000A
Zero .FILL x0030
One .FILL x0031
Count .FILL 15 ;I changed this to 14 (because 15 masks)
GREETING .STRINGZ "Enter a decimal number:"
NEWLINEVAL .FILL -10 ; '\n' is 10
Input .FILL x4321
.END