我正在尝试扩大一点掩码,但是当它以较低的数字工作时,它会在较高的数字时分崩离析

时间:2016-03-01 15:07:54

标签: assembly bitmask lc3

就在这里,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  

ENDLOOP

1 个答案:

答案 0 :(得分:1)

这在这里工作正常。我不得不改为十六进制常量,因为我的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