Add ES/Lab/LabMidsem/PerfectPerf.asm
This commit is contained in:
		
							parent
							
								
									55d79fbe6a
								
							
						
					
					
						commit
						f91427d180
					
				
					 1 changed files with 72 additions and 0 deletions
				
			
		
							
								
								
									
										72
									
								
								ES/Lab/LabMidsem/PerfectPerf.asm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								ES/Lab/LabMidsem/PerfectPerf.asm
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,72 @@
 | 
			
		|||
; question - find all divisors of a number like 6, and store in data memory. find if number is perfect or not. if sum of divisors is the number itself, then perfect. if perfect, store FF next to divisor list, otherwise store 11
 | 
			
		||||
; this version includes branching and works properly.
 | 
			
		||||
 | 
			
		||||
		AREA RESET, DATA, READONLY
 | 
			
		||||
        EXPORT __Vectors
 | 
			
		||||
__Vectors
 | 
			
		||||
        DCD 0x10001000
 | 
			
		||||
        DCD Reset_Handler
 | 
			
		||||
        ALIGN
 | 
			
		||||
 | 
			
		||||
        AREA MYCODE, CODE, READONLY
 | 
			
		||||
        ENTRY
 | 
			
		||||
        EXPORT Reset_Handler
 | 
			
		||||
 | 
			
		||||
Reset_Handler
 | 
			
		||||
        LDR R0, =9
 | 
			
		||||
        LDR R1, =0x10001000
 | 
			
		||||
        BL DivisorsSum
 | 
			
		||||
        MOV R2, R0
 | 
			
		||||
        MOV R3, R1
 | 
			
		||||
        LDR R4, =9
 | 
			
		||||
        CMP R2, R4
 | 
			
		||||
        BNE not_perfect
 | 
			
		||||
        LDR R5, =0x000000FF
 | 
			
		||||
        STR R5, [R3]
 | 
			
		||||
        B STOP
 | 
			
		||||
not_perfect
 | 
			
		||||
        LDR R5, =0x00000011
 | 
			
		||||
        STR R5, [R3]
 | 
			
		||||
STOP
 | 
			
		||||
        B STOP
 | 
			
		||||
 | 
			
		||||
DivisorsSum
 | 
			
		||||
        PUSH{R4-R7, LR}
 | 
			
		||||
        MOV R6, R0
 | 
			
		||||
        MOV R7, R1
 | 
			
		||||
        MOV R5, #0
 | 
			
		||||
        LSRS R3, R6, #1
 | 
			
		||||
        MOV R4, #1
 | 
			
		||||
div_loop
 | 
			
		||||
        CMP R4, R3
 | 
			
		||||
        BGT div_end
 | 
			
		||||
        MOV R0, R6
 | 
			
		||||
        MOV R1, R4
 | 
			
		||||
        BL IsDivisible
 | 
			
		||||
        CMP R0, #1
 | 
			
		||||
        BNE div_skip
 | 
			
		||||
        STR R4, [R7], #4
 | 
			
		||||
        ADD R5, R5, R4
 | 
			
		||||
div_skip
 | 
			
		||||
        ADD R4, R4, #1
 | 
			
		||||
        B div_loop
 | 
			
		||||
div_end
 | 
			
		||||
        MOV R0, R5
 | 
			
		||||
        MOV R1, R7
 | 
			
		||||
        POP{R4-R7, LR}
 | 
			
		||||
        BX LR
 | 
			
		||||
 | 
			
		||||
IsDivisible
 | 
			
		||||
        PUSH{LR}
 | 
			
		||||
        MOV R2, R0
 | 
			
		||||
id_loop
 | 
			
		||||
        SUBS R2, R2, R1
 | 
			
		||||
        BPL id_loop
 | 
			
		||||
        ADDS R2, R2, R1
 | 
			
		||||
        MOV R0, #0
 | 
			
		||||
        CMP R2, #0
 | 
			
		||||
        MOVEQ R0, #1
 | 
			
		||||
        POP{LR}
 | 
			
		||||
        BX LR
 | 
			
		||||
 | 
			
		||||
        END
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue