diff --git a/ES/Lab/LabMidsem/PerfectPerf.asm b/ES/Lab/LabMidsem/PerfectPerf.asm new file mode 100644 index 0000000..66fc114 --- /dev/null +++ b/ES/Lab/LabMidsem/PerfectPerf.asm @@ -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 \ No newline at end of file