diff --git a/lab-1/fib.s b/lab-1/fib.s index 14c6734..5acf6e0 100644 --- a/lab-1/fib.s +++ b/lab-1/fib.s @@ -9,35 +9,25 @@ .type fibonacci, function fibonacci: - @ ADD/MODIFY CODE BELOW +@ ADD/MODIFY CODE BELOW @ PROLOG - push {r3, r4, r5, lr} - - @ R4 = R0 - 0 (update flags) - @ if(R0 <= 0) goto .L3 (which returns 0) - - @ Compare R4 wtih 1 - @ If R4 == 1 goto .L4 (which returns 1) - - @ R0 = R4 - 1 - @ Recursive call to fibonacci with R4 - 1 as parameter - - @ R5 = R0 - @ R0 = R4 - 2 - @ Recursive call to fibonacci with R4 - 2 as parameter - - @ R0 = R5 + R0 (update flags) - - pop {r3, r4, r5, pc} @EPILOG + push {r3, r4, r5, r6, r7, lr} + + mov r4, r0 @counter + mov r5, #0 + sub r5, r5, #1 @previous + mov r6, #0 + add r6, r6, #1 @result +.L1: + sub r4, r4, #1 + add r7, r5, r6 @r7 = sum = previous + result + mov r5, r6 + mov r6, r7 + cmp r4 ,#-2 + bgt .L1 + mov r0, r5 + pop {r3, r4, r5, r6, r7, pc} @EPILOG @ END CODE MODIFICATION -.L3: - mov r0, #0 @ R0 = 0 - pop {r3, r4, r5, pc} @ EPILOG - -.L4: - mov r0, #1 @ R0 = 1 - pop {r3, r4, r5, pc} @ EPILOG - .size fibonacci, .-fibonacci .end diff --git a/lab-2/mutex.s b/lab-2/mutex.s index d23565d..983fdf4 100644 --- a/lab-2/mutex.s +++ b/lab-2/mutex.s @@ -9,7 +9,13 @@ .type lock_mutex, function lock_mutex: @ INSERT CODE BELOW - + ldr r1, =locked +.L1: + ldrex r2, [r0] + cmp r2, #0 + strexeq r2, r1, [r0] + cmpeq r2, #0 + bne .L1 @ END CODE INSERT bx lr @@ -19,7 +25,8 @@ lock_mutex: .type unlock_mutex, function unlock_mutex: @ INSERT CODE BELOW - + ldr r1, =unlocked + str r1, [r0] @ END CODE INSERT bx lr .size unlock_mutex, .-unlock_mutex diff --git a/lab-3/Makefile b/lab-3/Makefile index 2d0e91d..c708bfc 100644 --- a/lab-3/Makefile +++ b/lab-3/Makefile @@ -27,4 +27,4 @@ QEMU_CMD = qemu-arm -g 1234 -L /usr/arm-linux-gnueabihf ./fibseq & CMD = yes 9 | $(call QEMU_CMD) && sleep 1 qemu: fibseq yes 7 | $(call QEMU_CMD) - arm-none-eabi-gdb -x gdbscript fibseq + arm-none-eabi-gdb fibseq diff --git a/lab-3/Makefile~ b/lab-3/Makefile~ new file mode 100644 index 0000000..2d0e91d --- /dev/null +++ b/lab-3/Makefile~ @@ -0,0 +1,30 @@ +CC = arm-linux-gnueabihf-gcc +CFLAGS = -O0 -Wall -g +LDFLAGS = -fno-stack-protector + +objects = fibseq.o fib.o + +default: fibseq + +.PHONY: default clean qemu + +fibseq: $(objects) + $(CC) $(LDFLAGS) -o $@ $^ + +fib.o: fib.s +fibseq.o: fibseq.c + +%.o: %.c + $(CC) -c $(CFLAGS) -o $@ $< + +%.o: %.s + $(CC) -c $(CFLAGS) -o $@ $< + +clean: + rm -f $(objects) fibseq + +QEMU_CMD = qemu-arm -g 1234 -L /usr/arm-linux-gnueabihf ./fibseq & +CMD = yes 9 | $(call QEMU_CMD) && sleep 1 +qemu: fibseq + yes 7 | $(call QEMU_CMD) + arm-none-eabi-gdb -x gdbscript fibseq diff --git a/lab-3/fib.s b/lab-3/fib.s index 14c6734..5acf6e0 100644 --- a/lab-3/fib.s +++ b/lab-3/fib.s @@ -9,35 +9,25 @@ .type fibonacci, function fibonacci: - @ ADD/MODIFY CODE BELOW +@ ADD/MODIFY CODE BELOW @ PROLOG - push {r3, r4, r5, lr} - - @ R4 = R0 - 0 (update flags) - @ if(R0 <= 0) goto .L3 (which returns 0) - - @ Compare R4 wtih 1 - @ If R4 == 1 goto .L4 (which returns 1) - - @ R0 = R4 - 1 - @ Recursive call to fibonacci with R4 - 1 as parameter - - @ R5 = R0 - @ R0 = R4 - 2 - @ Recursive call to fibonacci with R4 - 2 as parameter - - @ R0 = R5 + R0 (update flags) - - pop {r3, r4, r5, pc} @EPILOG + push {r3, r4, r5, r6, r7, lr} + + mov r4, r0 @counter + mov r5, #0 + sub r5, r5, #1 @previous + mov r6, #0 + add r6, r6, #1 @result +.L1: + sub r4, r4, #1 + add r7, r5, r6 @r7 = sum = previous + result + mov r5, r6 + mov r6, r7 + cmp r4 ,#-2 + bgt .L1 + mov r0, r5 + pop {r3, r4, r5, r6, r7, pc} @EPILOG @ END CODE MODIFICATION -.L3: - mov r0, #0 @ R0 = 0 - pop {r3, r4, r5, pc} @ EPILOG - -.L4: - mov r0, #1 @ R0 = 1 - pop {r3, r4, r5, pc} @ EPILOG - .size fibonacci, .-fibonacci .end