├── lab-3 ├── gdbscript ├── fibseq.c ├── Makefile └── fib.s ├── .gitignore ├── example1 ├── cmd ├── example1.c └── Makefile ├── example6 ├── example6.c └── Makefile ├── lab-1 ├── fibseq.c ├── Makefile └── fib.s ├── example4 ├── example4.c └── Makefile ├── lab-1i ├── fibseq.c ├── Makefile └── fib.s ├── example3 ├── example3.c ├── example3_2.c ├── example3_1.c └── Makefile ├── example2 ├── example2.c_assembly ├── example2.c ├── multiply.s ├── example2.c_conly └── Makefile ├── hello ├── Makefile └── hello.s ├── example5 ├── Makefile ├── example5_1.c ├── example5.c ├── example5_2.c ├── example5_3.c ├── example5_1_dump.txt ├── example5_2_dump.txt └── example5_3_dump.txt └── lab-2 ├── Makefile ├── mutex.s └── atomic.c /lab-3/gdbscript: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | *.swp 3 | -------------------------------------------------------------------------------- /example1/cmd: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | qemu-arm -L /usr/arm-linux-gnueabihf ./example1 4 | echo $? 5 | -------------------------------------------------------------------------------- /example1/example1.c: -------------------------------------------------------------------------------- 1 | int add(int, int); 2 | 3 | int main() 4 | { 5 | int a, b, c; 6 | a=10; 7 | b=12; 8 | c=add(a,b); 9 | return 0; 10 | } 11 | 12 | int add(int a, int b) 13 | { 14 | return a+b; 15 | } 16 | -------------------------------------------------------------------------------- /example6/example6.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(void) 4 | { 5 | int a, b; 6 | int *x; 7 | a = 8; 8 | b = 9; 9 | 10 | x = &a; 11 | b = *x + 2; 12 | printf("The address of a is 0x%x\n",x); 13 | printf("The value of b is now %d\n",b); 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /lab-1/fibseq.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | extern int fibonacci(int x); 4 | 5 | int main(int argc, char **argv) 6 | { 7 | int number=0; 8 | int result=0; 9 | 10 | scanf("%d",&number); 11 | result = fibonacci(number); 12 | printf("The fibonacci sequence at %d is: %d\n", number, result); 13 | } 14 | 15 | -------------------------------------------------------------------------------- /lab-3/fibseq.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | extern int fibonacci(int x); 4 | 5 | int main(int argc, char **argv) 6 | { 7 | int number=0; 8 | int result=0; 9 | 10 | scanf("%d",&number); 11 | result = fibonacci(number); 12 | printf("The fibonacci sequence at %d is: %d\n", number, result); 13 | } 14 | 15 | -------------------------------------------------------------------------------- /example4/example4.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int multiply(int a, int b); 4 | 5 | int main(void) 6 | { 7 | int a, b, d; 8 | a = 221412523; 9 | b = 3; 10 | d = multiply(a,b); 11 | printf("a * b is %d\n", d); 12 | 13 | return 0; 14 | } 15 | 16 | int multiply(int a, int b) 17 | { 18 | return (a*b); 19 | } 20 | -------------------------------------------------------------------------------- /lab-1i/fibseq.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | extern int fibonacci(int x); 4 | 5 | int main(int argc, char **argv) 6 | { 7 | int number=0; 8 | int result=0; 9 | 10 | scanf("%d",&number); 11 | result = fibonacci(number); 12 | printf("The fibonacci sequence at %d is: %d\n", number, result); 13 | } 14 | 15 | -------------------------------------------------------------------------------- /example3/example3.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int dividebytwo(int a); 4 | 5 | int main(void) 6 | { 7 | int a, b, d; 8 | a = -6; 9 | b = 8; 10 | d = dividebytwo(a) / dividebytwo(b); 11 | printf("a/2 / b/2 is %d\n", d); 12 | 13 | return 0; 14 | } 15 | 16 | int dividebytwo(int a) 17 | { 18 | return a/2; 19 | } 20 | -------------------------------------------------------------------------------- /example3/example3_2.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int dividebytwo(int a); 4 | 5 | int main(void) 6 | { 7 | int a, b, d; 8 | a = -6; 9 | b = 8; 10 | d = dividebytwo(a) / dividebytwo(b); 11 | printf("2a * 2b is %d\n", d); 12 | 13 | return 0; 14 | } 15 | 16 | int dividebytwo(int a) 17 | { 18 | return a/2; 19 | } 20 | -------------------------------------------------------------------------------- /example3/example3_1.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int multiplybytwo(int a); 4 | 5 | int main(void) 6 | { 7 | int a, b, d; 8 | a = -6; 9 | b = 8; 10 | d = multiplybytwo(a) * multiplybytwo(b); 11 | printf("2a * 2b is %d\n", d); 12 | 13 | return 0; 14 | } 15 | 16 | int multiplybytwo(int a) 17 | { 18 | return a*2; 19 | } 20 | -------------------------------------------------------------------------------- /example2/example2.c_assembly: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | extern int multiply(int a, int b); 4 | extern int multiplyadd(int a, int b, int c); 5 | 6 | int main(void) 7 | { 8 | int a, b, c, d; 9 | a = 2; 10 | b = 3; 11 | c = 4; 12 | d = multiply(a,b); 13 | printf("a * b is %d\n", d); 14 | d = multiplyadd(a,b,c); 15 | printf("a * b + c is %d\n", d); 16 | 17 | return 0; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /hello/Makefile: -------------------------------------------------------------------------------- 1 | AS = arm-linux-gnueabihf-as 2 | LD = arm-linux-gnueabihf-ld 3 | SFLAGS = 4 | LDFLAGS = 5 | 6 | objects = hello.o 7 | 8 | default: hello 9 | 10 | .PHONY: default clean clobber 11 | 12 | hello: $(objects) 13 | $(LD) $(LDFLAGS) -o $@ $^ 14 | 15 | hello.o: hello.s 16 | 17 | %.o: %.s 18 | $(AS) -c $(SFLAGS) -o $@ $< 19 | 20 | clean: 21 | rm -f $(objects) hello 22 | 23 | qemu: hello 24 | qemu-arm ./hello 25 | -------------------------------------------------------------------------------- /example1/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -O2 -ggdb -Wall 3 | LDFLAGS = -fno-stack-protector 4 | 5 | objects = example1.o 6 | 7 | default: example1 8 | 9 | .PHONY: default clean clobber 10 | 11 | example1: $(objects) 12 | $(CC) -o $@ $^ 13 | 14 | example1.o: example1.c 15 | 16 | %.o: %.c 17 | $(CC) -c $(CFLAGS) $(LDFLAGS) -o $@ $< 18 | 19 | clean: 20 | rm -f $(objects) example1 21 | 22 | qemu: example1 23 | @sh cmd 24 | -------------------------------------------------------------------------------- /hello/hello.s: -------------------------------------------------------------------------------- 1 | .text 2 | _start: .global _start 3 | 4 | @ sys_write ( fd, pstr, len) 5 | @ r7=4 r0 r1 r2 6 | mov r0, #1 @ fd <- stdout 7 | adr r1, msg @ pstr <- *msg 8 | mov r2, #14 @ len <- 14 9 | mov r7, #4 @ syscall <- sys_write 10 | swi 0 @ system call 11 | 12 | @ sys_exit ( exitcode ) 13 | @ r7=1 r0 14 | mov r0, #0 @ exitcode <- 0 15 | mov r7, #1 @ syscall <- sys_exit 16 | swi 0 @ system call 17 | 18 | msg: 19 | .asciz "Hello, world!\n" 20 | .end 21 | -------------------------------------------------------------------------------- /example5/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -O0 -ggdb -Wall 3 | LDFLAGS = -fno-stack-protector 4 | 5 | objects = example5.o 6 | 7 | default: example5 8 | 9 | .PHONY: default clean 10 | 11 | example5: $(objects) 12 | $(CC) -o $@ $^ 13 | 14 | example5.o: example5.c 15 | 16 | %.o: %.c 17 | $(CC) -c $(CFLAGS) $(LDFLAGS) -o $@ $< 18 | 19 | clean: 20 | rm -f $(objects) example5 21 | 22 | qemu: 23 | qemu-arm -L /usr/arm-linux-gnueabihf ./example5 24 | -------------------------------------------------------------------------------- /example3/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -O3 -ggdb -Wall 3 | LDFLAGS = -fno-stack-protector 4 | 5 | objects = example3.o 6 | 7 | default: example3 8 | 9 | .PHONY: default clean 10 | 11 | example3: $(objects) 12 | $(CC) -o $@ $^ 13 | 14 | example3.o: example3.c 15 | 16 | %.o: %.c 17 | $(CC) -c $(CFLAGS) $(LDFLAGS) -o $@ $< 18 | 19 | clean: 20 | rm -f $(objects) example3 21 | 22 | qemu: example3 23 | qemu-arm -L /usr/arm-linux-gnueabihf ./example3 24 | -------------------------------------------------------------------------------- /example4/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -O2 -ggdb -Wall 3 | LDFLAGS = -fno-stack-protector 4 | 5 | objects = example4.o 6 | 7 | default: example4 8 | 9 | .PHONY: default clean 10 | 11 | example4: $(objects) 12 | $(CC) -o $@ $^ 13 | 14 | example4.o: example4.c 15 | 16 | %.o: %.c 17 | $(CC) -c $(CFLAGS) $(LDFLAGS) -o $@ $< 18 | 19 | clean: 20 | rm -f $(objects) example4 21 | 22 | qemu: example4 23 | qemu-arm -L /usr/arm-linux-gnueabihf ./example4 24 | -------------------------------------------------------------------------------- /example6/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -O0 -ggdb -Wall 3 | LDFLAGS = -fno-stack-protector 4 | 5 | objects = example6.o 6 | 7 | default: example6 8 | 9 | .PHONY: default clean 10 | 11 | example6: $(objects) 12 | $(CC) -o $@ $^ 13 | 14 | example6.o: example6.c 15 | 16 | %.o: %.c 17 | $(CC) -c $(CFLAGS) $(LDFLAGS) -o $@ $< 18 | 19 | clean: 20 | rm -f $(objects) example6 21 | 22 | qemu: example6 23 | qemu-arm -L /usr/arm-linux-gnueabihf ./example6 24 | -------------------------------------------------------------------------------- /lab-2/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -pthread -static 3 | 4 | objects = atomic.o mutex.o 5 | 6 | default: atomic 7 | 8 | .PHONY: default clean 9 | 10 | atomic: $(objects) 11 | $(CC) $(CFLAGS) -o$@ $^ 12 | 13 | atomic.o: atomic.c 14 | mutex.o: mutex.s 15 | 16 | %.o: %.c 17 | $(CC) -c $(CFLAGS) -o $@ $< 18 | 19 | %.o: %.s 20 | $(CC) -c $(CFLAGS) -o $@ $< 21 | 22 | clean: 23 | rm -f $(objects) atomic 24 | 25 | qemu: atomic 26 | qemu-arm ./atomic 27 | -------------------------------------------------------------------------------- /example2/example2.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | extern int multiply(int a, int b); 4 | extern int multiplyadd(int a, int b, int c); 5 | extern int multiplysub(int a, int b, int c); 6 | 7 | int main(void) 8 | { 9 | int a, b, c, d; 10 | a = 10; 11 | b = 14; 12 | c = 3; 13 | d = multiply(a,b); 14 | printf("a * b is %d\n", d); 15 | d = multiplyadd(a,b,c); 16 | printf("a * b + c is %d\n", d); 17 | d = multiplysub(a,b,c); 18 | printf("c - a * b is %d\n", d); 19 | 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /example2/multiply.s: -------------------------------------------------------------------------------- 1 | .text 2 | .global multiply 3 | multiply: 4 | mul R0, R1, R0 5 | bx lr 6 | nop 7 | .type multiply, function 8 | .size multipy, .-multiply 9 | 10 | .global multiplyadd 11 | multiplyadd: 12 | mla r0, r0, r1, r2 13 | bx lr 14 | nop 15 | .type multiplyadd, function 16 | .size multiplyadd, .-multiplyadd 17 | 18 | .global multiplysub 19 | multiplysub: 20 | mls r0, r0, r1, r2 21 | bx lr 22 | nop 23 | .type multiplysub, function 24 | .size multiplysub, .-multiplysub 25 | .end 26 | -------------------------------------------------------------------------------- /example2/example2.c_conly: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int multiply(int a, int b); 4 | int multiplyadd(int a, int b, int c); 5 | 6 | int main(void) 7 | { 8 | int a, b, c, d; 9 | a = 2; 10 | b = 3; 11 | c = 4; 12 | d = multiply(a,b); 13 | printf("a * b is %d\n", d); 14 | d = multiplyadd(a,b,c); 15 | printf("a * b + c is %d\n", d); 16 | 17 | return 0; 18 | } 19 | 20 | int multiply(int a, int b) 21 | { 22 | return (a*b); 23 | } 24 | 25 | int multiplyadd(int a, int b, int c) 26 | { 27 | return ((a*b)+c); 28 | } 29 | -------------------------------------------------------------------------------- /lab-2/mutex.s: -------------------------------------------------------------------------------- 1 | .syntax unified 2 | .arch armv7-a 3 | .text 4 | 5 | .equ locked, 1 6 | .equ unlocked, 0 7 | 8 | .global lock_mutex 9 | .type lock_mutex, function 10 | lock_mutex: 11 | @ INSERT CODE BELOW 12 | 13 | @ END CODE INSERT 14 | bx lr 15 | 16 | .size lock_mutex, .-lock_mutex 17 | 18 | .global unlock_mutex 19 | .type unlock_mutex, function 20 | unlock_mutex: 21 | @ INSERT CODE BELOW 22 | 23 | @ END CODE INSERT 24 | bx lr 25 | .size unlock_mutex, .-unlock_mutex 26 | 27 | .end 28 | -------------------------------------------------------------------------------- /example5/example5_1.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int and(int a, int b); 4 | 5 | int main(void) 6 | { 7 | int a, b, x, d; 8 | a = 221412523; 9 | b = 374719560; 10 | 11 | asm("mrs %[result], apsr" : [result] "=r" (x) : ); 12 | 13 | d = and(a,b); 14 | 15 | printf("a & b is %d\n", d); 16 | printf("Before operation, apsr was %x\n",x); 17 | 18 | asm("mrs %[result], apsr" : [result] "=r" (x) : ); 19 | printf("After operation, apsr was %x\n",x); 20 | 21 | return 0; 22 | } 23 | 24 | int and(int a, int b) 25 | { 26 | return (a&b); 27 | } 28 | -------------------------------------------------------------------------------- /example2/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | AS = arm-linux-gnueabihf-as 3 | CFLAGS = -O2 -ggdb -Wall 4 | LDFLAGS = -fno-stack-protector 5 | 6 | objects = example2.o multiply.o 7 | 8 | default: example2 9 | 10 | .PHONY: default clean clobber 11 | 12 | example2: $(objects) 13 | $(CC) -o $@ $^ 14 | 15 | example2.o: example2.c 16 | 17 | %.o: %.c 18 | $(CC) -c $(CFLAGS) $(LDFLAGS) -o $@ $< 19 | 20 | %.o: %.s 21 | $(AS) -o $@ $< 22 | clean: 23 | rm -f $(objects) example2 24 | 25 | qemu: example2 26 | qemu-arm -L /usr/arm-linux-gnueabihf ./example2 27 | -------------------------------------------------------------------------------- /example5/example5.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int add(int a, int b); 4 | int subtract(int a, int b); 5 | 6 | int main(void) 7 | { 8 | int a, b, x, d; 9 | a = 8; 10 | b = 9; 11 | 12 | asm("mrs %[result], apsr" : [result] "=r" (x) : ); 13 | 14 | d = (a ^ b) > 0 ? add(a,b) : subtract(b,a); 15 | 16 | printf("a & b is %d\n", d); 17 | printf("Before operation, apsr was %x\n",x); 18 | 19 | asm("mrs %[result], apsr" : [result] "=r" (x) : ); 20 | printf("After operation, apsr was %x\n",x); 21 | 22 | return 0; 23 | } 24 | 25 | int add(int a, int b) 26 | { 27 | return (a+b); 28 | } 29 | 30 | int subtract(int a, int b) 31 | { 32 | return (a-b); 33 | } 34 | -------------------------------------------------------------------------------- /lab-3/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -O0 -Wall -g 3 | LDFLAGS = -fno-stack-protector 4 | 5 | objects = fibseq.o fib.o 6 | 7 | default: fibseq 8 | 9 | .PHONY: default clean qemu 10 | 11 | fibseq: $(objects) 12 | $(CC) $(LDFLAGS) -o $@ $^ 13 | 14 | fib.o: fib.s 15 | fibseq.o: fibseq.c 16 | 17 | %.o: %.c 18 | $(CC) -c $(CFLAGS) -o $@ $< 19 | 20 | %.o: %.s 21 | $(CC) -c $(CFLAGS) -o $@ $< 22 | 23 | clean: 24 | rm -f $(objects) fibseq 25 | 26 | QEMU_CMD = qemu-arm -g 1234 -L /usr/arm-linux-gnueabihf ./fibseq & 27 | CMD = yes 9 | $(call QEMU_CMD) && sleep 1 28 | qemu: fibseq 29 | yes 7 | $(call QEMU_CMD) 30 | arm-none-eabi-gdb -x gdbscript fibseq 31 | -------------------------------------------------------------------------------- /lab-1/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -O1 -Wall 3 | LDFLAGS = -fno-stack-protector 4 | 5 | objects = fibseq.o fib.o 6 | 7 | default: fibseq 8 | 9 | .PHONY: default clean qemu 10 | 11 | fibseq: $(objects) 12 | $(CC) $(LDFLAGS) -o $@ $^ 13 | 14 | fib.o: fib.s 15 | fibseq.o: fibseq.c 16 | 17 | %.o: %.c 18 | $(CC) -c $(CFLAGS) -o $@ $< 19 | 20 | %.o: %.s 21 | $(CC) -c $(CFLAGS) -o $@ $< 22 | 23 | clean: 24 | rm -f $(objects) fibseq 25 | 26 | QEMU_CMD = qemu-arm -L /usr/arm-linux-gnueabihf ./fibseq & 27 | CMD = yes 9 | $(call QEMU_CMD) && sleep 1 28 | qemu: fibseq 29 | @yes 5 | $(call QEMU_CMD) 30 | @sleep 1 31 | @yes 6 | $(call QEMU_CMD) 32 | @sleep 1 33 | @yes 7 | $(call QEMU_CMD) 34 | @sleep 1 35 | -------------------------------------------------------------------------------- /lab-1i/Makefile: -------------------------------------------------------------------------------- 1 | CC = arm-linux-gnueabihf-gcc 2 | CFLAGS = -O1 -Wall 3 | LDFLAGS = -fno-stack-protector 4 | 5 | objects = fibseq.o fib.o 6 | 7 | default: fibseq 8 | 9 | .PHONY: default clean qemu 10 | 11 | fibseq: $(objects) 12 | $(CC) $(LDFLAGS) -o $@ $^ 13 | 14 | fib.o: fib.s 15 | fibseq.o: fibseq.c 16 | 17 | %.o: %.c 18 | $(CC) -c $(CFLAGS) -o $@ $< 19 | 20 | %.o: %.s 21 | $(CC) -c $(CFLAGS) -o $@ $< 22 | 23 | clean: 24 | rm -f $(objects) fibseq 25 | 26 | QEMU_CMD = qemu-arm -L /usr/arm-linux-gnueabihf ./fibseq & 27 | CMD = yes 9 | $(call QEMU_CMD) && sleep 1 28 | qemu: fibseq 29 | @yes 5 | $(call QEMU_CMD) 30 | @sleep 1 31 | @yes 6 | $(call QEMU_CMD) 32 | @sleep 1 33 | @yes 7 | $(call QEMU_CMD) 34 | @sleep 1 35 | -------------------------------------------------------------------------------- /example5/example5_2.c: -------------------------------------------------------------------------------- 1 | /* This file is part of the examples given in the slide. 2 | * For educational use as part of the Intro to ARM course at http://www.opensecuritytraining.info/IntroARM.html . 3 | */ 4 | #include 5 | 6 | int orr(int a, int b); 7 | 8 | int main(void) 9 | { 10 | int a, b, x, d; 11 | a = 221412523; 12 | b = 374719560; 13 | 14 | asm("mrs %[result], apsr" : [result] "=r" (x) : ); 15 | 16 | d = orr(a,b); 17 | 18 | printf("a | b is %d\n", d); 19 | printf("Before operation, apsr was %x\n",x); 20 | 21 | asm("mrs %[result], apsr" : [result] "=r" (x) : ); 22 | printf("After operation, apsr was %x\n",x); 23 | 24 | return 0; 25 | } 26 | 27 | int orr(int a, int b) 28 | { 29 | return (a|b); 30 | } 31 | -------------------------------------------------------------------------------- /example5/example5_3.c: -------------------------------------------------------------------------------- 1 | /* This file is part of the examples given in the slide. 2 | * For educational use as part of the Intro to ARM course at http://www.opensecuritytraining.info/IntroARM.html . 3 | */ 4 | #include 5 | 6 | int add(int a, int b); 7 | int subtract(int a, int b); 8 | 9 | int main(void) 10 | { 11 | int a, b, x, d; 12 | a = 8; 13 | b = 9; 14 | 15 | asm("mrs %[result], apsr" : [result] "=r" (x) : ); 16 | 17 | if((a ^ b) > 0) 18 | d = add(a,b); 19 | else 20 | d = subtract(b,a); 21 | 22 | printf("a & b is %d\n", d); 23 | printf("Before operation, apsr was %x\n",x); 24 | 25 | asm("mrs %[result], apsr" : [result] "=r" (x) : ); 26 | printf("After operation, apsr was %x\n",x); 27 | 28 | return 0; 29 | } 30 | 31 | int add(int a, int b) 32 | { 33 | return (a+b); 34 | } 35 | 36 | int subtract(int a, int b) 37 | { 38 | return (a-b); 39 | } 40 | -------------------------------------------------------------------------------- /lab-1/fib.s: -------------------------------------------------------------------------------- 1 | .syntax unified 2 | .arch armv7-a 3 | .text 4 | .align 2 5 | .thumb 6 | .thumb_func 7 | 8 | .global fibonacci 9 | .type fibonacci, function 10 | 11 | fibonacci: 12 | @ ADD/MODIFY CODE BELOW 13 | @ PROLOG 14 | push {r3, r4, r5, lr} 15 | 16 | @ R4 = R0 - 0 (update flags) 17 | @ if(R0 <= 0) goto .L3 (which returns 0) 18 | 19 | @ Compare R4 wtih 1 20 | @ If R4 == 1 goto .L4 (which returns 1) 21 | 22 | @ R0 = R4 - 1 23 | @ Recursive call to fibonacci with R4 - 1 as parameter 24 | 25 | @ R5 = R0 26 | @ R0 = R4 - 2 27 | @ Recursive call to fibonacci with R4 - 2 as parameter 28 | 29 | @ R0 = R5 + R0 (update flags) 30 | 31 | pop {r3, r4, r5, pc} @EPILOG 32 | 33 | @ END CODE MODIFICATION 34 | .L3: 35 | mov r0, #0 @ R0 = 0 36 | pop {r3, r4, r5, pc} @ EPILOG 37 | 38 | .L4: 39 | mov r0, #1 @ R0 = 1 40 | pop {r3, r4, r5, pc} @ EPILOG 41 | 42 | .size fibonacci, .-fibonacci 43 | .end 44 | -------------------------------------------------------------------------------- /lab-3/fib.s: -------------------------------------------------------------------------------- 1 | .syntax unified 2 | .arch armv7-a 3 | .text 4 | .align 2 5 | .thumb 6 | .thumb_func 7 | 8 | .global fibonacci 9 | .type fibonacci, function 10 | 11 | fibonacci: 12 | @ ADD/MODIFY CODE BELOW 13 | @ PROLOG 14 | push {r3, r4, r5, lr} 15 | 16 | @ R4 = R0 - 0 (update flags) 17 | @ if(R0 <= 0) goto .L3 (which returns 0) 18 | 19 | @ Compare R4 wtih 1 20 | @ If R4 == 1 goto .L4 (which returns 1) 21 | 22 | @ R0 = R4 - 1 23 | @ Recursive call to fibonacci with R4 - 1 as parameter 24 | 25 | @ R5 = R0 26 | @ R0 = R4 - 2 27 | @ Recursive call to fibonacci with R4 - 2 as parameter 28 | 29 | @ R0 = R5 + R0 (update flags) 30 | 31 | pop {r3, r4, r5, pc} @EPILOG 32 | 33 | @ END CODE MODIFICATION 34 | .L3: 35 | mov r0, #0 @ R0 = 0 36 | pop {r3, r4, r5, pc} @ EPILOG 37 | 38 | .L4: 39 | mov r0, #1 @ R0 = 1 40 | pop {r3, r4, r5, pc} @ EPILOG 41 | 42 | .size fibonacci, .-fibonacci 43 | .end 44 | -------------------------------------------------------------------------------- /lab-1i/fib.s: -------------------------------------------------------------------------------- 1 | .syntax unified 2 | .arch armv7-a 3 | .text 4 | .align 2 5 | .thumb 6 | .thumb_func 7 | 8 | .global fibonacci 9 | .type fibonacci, function 10 | 11 | fibonacci: 12 | @ ADD/MODIFY CODE BELOW 13 | @ PROLOG 14 | push {r3, r4, r5, lr} 15 | 16 | @ R4 = R0 - 0 (update flags) 17 | @ if(R0 <= 0) goto .L3 (which returns 0) 18 | 19 | @ Compare R4 wtih 1 20 | @ If R4 == 1 goto .L4 (which returns 1) 21 | 22 | @ R0 = R4 - 1 23 | @ Recursive call to fibonacci with R4 - 1 as parameter 24 | 25 | @ R5 = R0 26 | @ R0 = R4 - 2 27 | @ Recursive call to fibonacci with R4 - 2 as parameter 28 | 29 | @ R0 = R5 + R0 (update flags) 30 | 31 | pop {r3, r4, r5, pc} @EPILOG 32 | 33 | @ END CODE MODIFICATION 34 | .L3: 35 | mov r0, #0 @ R0 = 0 36 | pop {r3, r4, r5, pc} @ EPILOG 37 | 38 | .L4: 39 | mov r0, #1 @ R0 = 1 40 | pop {r3, r4, r5, pc} @ EPILOG 41 | 42 | .size fibonacci, .-fibonacci 43 | .end 44 | -------------------------------------------------------------------------------- /lab-2/atomic.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define locked 1 8 | #define unlocked 0 9 | 10 | extern void lock_mutex(void *mutex); 11 | extern void unlock_mutex(void *mutex); 12 | 13 | pthread_t tid[2]; 14 | int counter; 15 | // pthread_mutex_t lock; 16 | unsigned int mutexlock = unlocked; 17 | 18 | void *doSomeThing(void *arg) 19 | { 20 | // pthread_mutex_lock(&lock); 21 | lock_mutex(&mutexlock); 22 | unsigned long i = 0; 23 | counter += 1; 24 | printf("\n Job %d started\n", counter); 25 | 26 | for (i = 0; i < (0xFFFFFFFF); i++); 27 | 28 | printf("\n Job %d finished\n", counter); 29 | 30 | // pthread_mutex_unlock(&lock); 31 | unlock_mutex(&mutexlock); 32 | return NULL; 33 | } 34 | 35 | int main(void) 36 | { 37 | int i = 0; 38 | int err; 39 | 40 | #if 0 41 | if (pthread_mutex_init(&lock, NULL) != 0) { 42 | printf("\n mutex init failed\n"); 43 | return 1; 44 | } 45 | #endif 46 | 47 | while (i < 2) { 48 | err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL); 49 | if (err != 0) 50 | printf("\ncan't create thread :[%s]", strerror(err)); 51 | i++; 52 | } 53 | 54 | pthread_join(tid[0], NULL); 55 | pthread_join(tid[1], NULL); 56 | // pthread_mutex_destroy(&lock); 57 | 58 | return 0; 59 | } 60 | -------------------------------------------------------------------------------- /example5/example5_1_dump.txt: -------------------------------------------------------------------------------- 1 | example5: file format elf32-littlearm 2 | 3 | 4 | Disassembly of section .init: 5 | 6 | 000082c4 <_init>: 7 | 82c4: b508 push {r3, lr} 8 | 82c6: f000 f863 bl 8390 9 | 82ca: bf00 nop 10 | 82cc: bd08 pop {r3, pc} 11 | 12 | Disassembly of section .plt: 13 | 14 | 000082d0 <.plt>: 15 | 82d0: e52de004 push {lr} ; (str lr, [sp, #-4]!) 16 | 82d4: e59fe004 ldr lr, [pc, #4] ; 82e0 <_init+0x1c> 17 | 82d8: e08fe00e add lr, pc, lr 18 | 82dc: e5bef008 ldr pc, [lr, #8]! 19 | 82e0: 00008d20 .word 0x00008d20 20 | 82e4: e28fc600 add ip, pc, #0, 12 21 | 82e8: e28cca08 add ip, ip, #8, 20 ; 0x8000 22 | 82ec: e5bcfd20 ldr pc, [ip, #3360]! ; 0xd20 23 | 82f0: 4778 bx pc 24 | 82f2: 46c0 nop ; (mov r8, r8) 25 | 82f4: e28fc600 add ip, pc, #0, 12 26 | 82f8: e28cca08 add ip, ip, #8, 20 ; 0x8000 27 | 82fc: e5bcfd14 ldr pc, [ip, #3348]! ; 0xd14 28 | 8300: e28fc600 add ip, pc, #0, 12 29 | 8304: e28cca08 add ip, ip, #8, 20 ; 0x8000 30 | 8308: e5bcfd0c ldr pc, [ip, #3340]! ; 0xd0c 31 | 830c: e28fc600 add ip, pc, #0, 12 32 | 8310: e28cca08 add ip, ip, #8, 20 ; 0x8000 33 | 8314: e5bcfd04 ldr pc, [ip, #3332]! ; 0xd04 34 | 35 | Disassembly of section .text: 36 | 37 | 00008318
: 38 | 8318: b510 push {r4, lr} 39 | 831a: 2001 movs r0, #1 40 | 831c: f248 4128 movw r1, #33832 ; 0x8428 41 | 8320: f244 4208 movw r2, #17416 ; 0x4408 42 | 8324: f2c0 0100 movt r1, #0 43 | 8328: f2c0 4210 movt r2, #1040 ; 0x410 44 | 832c: f7ff efe8 blx 8300 <_init+0x3c> 45 | 8330: 2001 movs r0, #1 46 | 8332: f3ef 8400 mrs r4, CPSR 47 | 8336: f248 4138 movw r1, #33848 ; 0x8438 48 | 833a: 4622 mov r2, r4 49 | 833c: f2c0 0100 movt r1, #0 50 | 8340: f7ff efde blx 8300 <_init+0x3c> 51 | 8344: 2001 movs r0, #1 52 | 8346: 4622 mov r2, r4 53 | 8348: f248 4158 movw r1, #33880 ; 0x8458 54 | 834c: f2c0 0100 movt r1, #0 55 | 8350: f7ff efd6 blx 8300 <_init+0x3c> 56 | 8354: 2000 movs r0, #0 57 | 8356: bd10 pop {r4, pc} 58 | 59 | 00008358 <_start>: 60 | 8358: f04f 0b00 mov.w fp, #0 61 | 835c: f04f 0e00 mov.w lr, #0 62 | 8360: f85d 1b04 ldr.w r1, [sp], #4 63 | 8364: 466a mov r2, sp 64 | 8366: f84d 2d04 str.w r2, [sp, #-4]! 65 | 836a: f84d 0d04 str.w r0, [sp, #-4]! 66 | 836e: f8df c014 ldr.w ip, [pc, #20] ; 8384 <_start+0x2c> 67 | 8372: f84d cd04 str.w ip, [sp, #-4]! 68 | 8376: 4804 ldr r0, [pc, #16] ; (8388 <_start+0x30>) 69 | 8378: 4b04 ldr r3, [pc, #16] ; (838c <_start+0x34>) 70 | 837a: f7ff efb4 blx 82e4 <_init+0x20> 71 | 837e: f7ff efc6 blx 830c <_init+0x48> 72 | 8382: 0000 .short 0x0000 73 | 8384: 00008419 .word 0x00008419 74 | 8388: 00008319 .word 0x00008319 75 | 838c: 000083d5 .word 0x000083d5 76 | 77 | 00008390 : 78 | 8390: 4b03 ldr r3, [pc, #12] ; (83a0 ) 79 | 8392: 4a04 ldr r2, [pc, #16] ; (83a4 ) 80 | 8394: 447b add r3, pc 81 | 8396: 589b ldr r3, [r3, r2] 82 | 8398: b10b cbz r3, 839e 83 | 839a: f7ff bfa9 b.w 82f0 <_init+0x2c> 84 | 839e: 4770 bx lr 85 | 83a0: 00008c68 .word 0x00008c68 86 | 83a4: 0000001c .word 0x0000001c 87 | 88 | 000083a8 <__do_global_dtors_aux>: 89 | 83a8: 4b02 ldr r3, [pc, #8] ; (83b4 <__do_global_dtors_aux+0xc>) 90 | 83aa: 781a ldrb r2, [r3, #0] 91 | 83ac: b90a cbnz r2, 83b2 <__do_global_dtors_aux+0xa> 92 | 83ae: 2201 movs r2, #1 93 | 83b0: 701a strb r2, [r3, #0] 94 | 83b2: 4770 bx lr 95 | 83b4: 00011028 .word 0x00011028 96 | 97 | 000083b8 : 98 | 83b8: 4803 ldr r0, [pc, #12] ; (83c8 ) 99 | 83ba: b508 push {r3, lr} 100 | 83bc: 6803 ldr r3, [r0, #0] 101 | 83be: b113 cbz r3, 83c6 102 | 83c0: 4b02 ldr r3, [pc, #8] ; (83cc ) 103 | 83c2: b103 cbz r3, 83c6 104 | 83c4: 4798 blx r3 105 | 83c6: bd08 pop {r3, pc} 106 | 83c8: 00010f14 .word 0x00010f14 107 | 83cc: 00000000 .word 0x00000000 108 | 109 | 000083d0 : 110 | 83d0: 4008 ands r0, r1 111 | 83d2: 4770 bx lr 112 | 113 | 000083d4 <__libc_csu_init>: 114 | 83d4: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 115 | 83d8: 4606 mov r6, r0 116 | 83da: f8df 9034 ldr.w r9, [pc, #52] ; 8410 <__libc_csu_init+0x3c> 117 | 83de: 460f mov r7, r1 118 | 83e0: 4d0c ldr r5, [pc, #48] ; (8414 <__libc_csu_init+0x40>) 119 | 83e2: 4690 mov r8, r2 120 | 83e4: 44f9 add r9, pc 121 | 83e6: f7ff ff6d bl 82c4 <_init> 122 | 83ea: 447d add r5, pc 123 | 83ec: ebc5 0909 rsb r9, r5, r9 124 | 83f0: ea5f 09a9 movs.w r9, r9, asr #2 125 | 83f4: d009 beq.n 840a <__libc_csu_init+0x36> 126 | 83f6: 2400 movs r4, #0 127 | 83f8: f855 3b04 ldr.w r3, [r5], #4 128 | 83fc: 4630 mov r0, r6 129 | 83fe: 4639 mov r1, r7 130 | 8400: 4642 mov r2, r8 131 | 8402: 3401 adds r4, #1 132 | 8404: 4798 blx r3 133 | 8406: 454c cmp r4, r9 134 | 8408: d1f6 bne.n 83f8 <__libc_csu_init+0x24> 135 | 840a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 136 | 840e: bf00 nop 137 | 8410: 00008b28 .word 0x00008b28 138 | 8414: 00008b1e .word 0x00008b1e 139 | 140 | 00008418 <__libc_csu_fini>: 141 | 8418: 4770 bx lr 142 | 841a: bf00 nop 143 | 144 | Disassembly of section .fini: 145 | 146 | 0000841c <_fini>: 147 | 841c: b508 push {r3, lr} 148 | 841e: bf00 nop 149 | 8420: bd08 pop {r3, pc} 150 | -------------------------------------------------------------------------------- /example5/example5_2_dump.txt: -------------------------------------------------------------------------------- 1 | example5: file format elf32-littlearm 2 | 3 | 4 | Disassembly of section .init: 5 | 6 | 000082c4 <_init>: 7 | 82c4: b508 push {r3, lr} 8 | 82c6: f000 f863 bl 8390 9 | 82ca: bf00 nop 10 | 82cc: bd08 pop {r3, pc} 11 | 12 | Disassembly of section .plt: 13 | 14 | 000082d0 <.plt>: 15 | 82d0: e52de004 push {lr} ; (str lr, [sp, #-4]!) 16 | 82d4: e59fe004 ldr lr, [pc, #4] ; 82e0 <_init+0x1c> 17 | 82d8: e08fe00e add lr, pc, lr 18 | 82dc: e5bef008 ldr pc, [lr, #8]! 19 | 82e0: 00008d20 .word 0x00008d20 20 | 82e4: e28fc600 add ip, pc, #0, 12 21 | 82e8: e28cca08 add ip, ip, #8, 20 ; 0x8000 22 | 82ec: e5bcfd20 ldr pc, [ip, #3360]! ; 0xd20 23 | 82f0: 4778 bx pc 24 | 82f2: 46c0 nop ; (mov r8, r8) 25 | 82f4: e28fc600 add ip, pc, #0, 12 26 | 82f8: e28cca08 add ip, ip, #8, 20 ; 0x8000 27 | 82fc: e5bcfd14 ldr pc, [ip, #3348]! ; 0xd14 28 | 8300: e28fc600 add ip, pc, #0, 12 29 | 8304: e28cca08 add ip, ip, #8, 20 ; 0x8000 30 | 8308: e5bcfd0c ldr pc, [ip, #3340]! ; 0xd0c 31 | 830c: e28fc600 add ip, pc, #0, 12 32 | 8310: e28cca08 add ip, ip, #8, 20 ; 0x8000 33 | 8314: e5bcfd04 ldr pc, [ip, #3332]! ; 0xd04 34 | 35 | Disassembly of section .text: 36 | 37 | 00008318
: 38 | 8318: b510 push {r4, lr} 39 | 831a: 2001 movs r0, #1 40 | 831c: f248 4128 movw r1, #33832 ; 0x8428 41 | 8320: f64f 42eb movw r2, #64747 ; 0xfceb 42 | 8324: f2c0 0100 movt r1, #0 43 | 8328: f6c1 7277 movt r2, #8055 ; 0x1f77 44 | 832c: f7ff efe8 blx 8300 <_init+0x3c> 45 | 8330: 2001 movs r0, #1 46 | 8332: f3ef 8400 mrs r4, CPSR 47 | 8336: f248 4138 movw r1, #33848 ; 0x8438 48 | 833a: 4622 mov r2, r4 49 | 833c: f2c0 0100 movt r1, #0 50 | 8340: f7ff efde blx 8300 <_init+0x3c> 51 | 8344: 2001 movs r0, #1 52 | 8346: 4622 mov r2, r4 53 | 8348: f248 4158 movw r1, #33880 ; 0x8458 54 | 834c: f2c0 0100 movt r1, #0 55 | 8350: f7ff efd6 blx 8300 <_init+0x3c> 56 | 8354: 2000 movs r0, #0 57 | 8356: bd10 pop {r4, pc} 58 | 59 | 00008358 <_start>: 60 | 8358: f04f 0b00 mov.w fp, #0 61 | 835c: f04f 0e00 mov.w lr, #0 62 | 8360: f85d 1b04 ldr.w r1, [sp], #4 63 | 8364: 466a mov r2, sp 64 | 8366: f84d 2d04 str.w r2, [sp, #-4]! 65 | 836a: f84d 0d04 str.w r0, [sp, #-4]! 66 | 836e: f8df c014 ldr.w ip, [pc, #20] ; 8384 <_start+0x2c> 67 | 8372: f84d cd04 str.w ip, [sp, #-4]! 68 | 8376: 4804 ldr r0, [pc, #16] ; (8388 <_start+0x30>) 69 | 8378: 4b04 ldr r3, [pc, #16] ; (838c <_start+0x34>) 70 | 837a: f7ff efb4 blx 82e4 <_init+0x20> 71 | 837e: f7ff efc6 blx 830c <_init+0x48> 72 | 8382: 0000 .short 0x0000 73 | 8384: 00008419 .word 0x00008419 74 | 8388: 00008319 .word 0x00008319 75 | 838c: 000083d5 .word 0x000083d5 76 | 77 | 00008390 : 78 | 8390: 4b03 ldr r3, [pc, #12] ; (83a0 ) 79 | 8392: 4a04 ldr r2, [pc, #16] ; (83a4 ) 80 | 8394: 447b add r3, pc 81 | 8396: 589b ldr r3, [r3, r2] 82 | 8398: b10b cbz r3, 839e 83 | 839a: f7ff bfa9 b.w 82f0 <_init+0x2c> 84 | 839e: 4770 bx lr 85 | 83a0: 00008c68 .word 0x00008c68 86 | 83a4: 0000001c .word 0x0000001c 87 | 88 | 000083a8 <__do_global_dtors_aux>: 89 | 83a8: 4b02 ldr r3, [pc, #8] ; (83b4 <__do_global_dtors_aux+0xc>) 90 | 83aa: 781a ldrb r2, [r3, #0] 91 | 83ac: b90a cbnz r2, 83b2 <__do_global_dtors_aux+0xa> 92 | 83ae: 2201 movs r2, #1 93 | 83b0: 701a strb r2, [r3, #0] 94 | 83b2: 4770 bx lr 95 | 83b4: 00011028 .word 0x00011028 96 | 97 | 000083b8 : 98 | 83b8: 4803 ldr r0, [pc, #12] ; (83c8 ) 99 | 83ba: b508 push {r3, lr} 100 | 83bc: 6803 ldr r3, [r0, #0] 101 | 83be: b113 cbz r3, 83c6 102 | 83c0: 4b02 ldr r3, [pc, #8] ; (83cc ) 103 | 83c2: b103 cbz r3, 83c6 104 | 83c4: 4798 blx r3 105 | 83c6: bd08 pop {r3, pc} 106 | 83c8: 00010f14 .word 0x00010f14 107 | 83cc: 00000000 .word 0x00000000 108 | 109 | 000083d0 : 110 | 83d0: 4308 orrs r0, r1 111 | 83d2: 4770 bx lr 112 | 113 | 000083d4 <__libc_csu_init>: 114 | 83d4: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 115 | 83d8: 4606 mov r6, r0 116 | 83da: f8df 9034 ldr.w r9, [pc, #52] ; 8410 <__libc_csu_init+0x3c> 117 | 83de: 460f mov r7, r1 118 | 83e0: 4d0c ldr r5, [pc, #48] ; (8414 <__libc_csu_init+0x40>) 119 | 83e2: 4690 mov r8, r2 120 | 83e4: 44f9 add r9, pc 121 | 83e6: f7ff ff6d bl 82c4 <_init> 122 | 83ea: 447d add r5, pc 123 | 83ec: ebc5 0909 rsb r9, r5, r9 124 | 83f0: ea5f 09a9 movs.w r9, r9, asr #2 125 | 83f4: d009 beq.n 840a <__libc_csu_init+0x36> 126 | 83f6: 2400 movs r4, #0 127 | 83f8: f855 3b04 ldr.w r3, [r5], #4 128 | 83fc: 4630 mov r0, r6 129 | 83fe: 4639 mov r1, r7 130 | 8400: 4642 mov r2, r8 131 | 8402: 3401 adds r4, #1 132 | 8404: 4798 blx r3 133 | 8406: 454c cmp r4, r9 134 | 8408: d1f6 bne.n 83f8 <__libc_csu_init+0x24> 135 | 840a: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 136 | 840e: bf00 nop 137 | 8410: 00008b28 .word 0x00008b28 138 | 8414: 00008b1e .word 0x00008b1e 139 | 140 | 00008418 <__libc_csu_fini>: 141 | 8418: 4770 bx lr 142 | 841a: bf00 nop 143 | 144 | Disassembly of section .fini: 145 | 146 | 0000841c <_fini>: 147 | 841c: b508 push {r3, lr} 148 | 841e: bf00 nop 149 | 8420: bd08 pop {r3, pc} 150 | -------------------------------------------------------------------------------- /example5/example5_3_dump.txt: -------------------------------------------------------------------------------- 1 | example5: file format elf32-littlearm 2 | 3 | 4 | Disassembly of section .init: 5 | 6 | 000082c0 <_init>: 7 | 82c0: b508 push {r3, lr} 8 | 82c2: f000 f843 bl 834c 9 | 82c6: bf00 nop 10 | 82c8: bd08 pop {r3, pc} 11 | 12 | Disassembly of section .plt: 13 | 14 | 000082cc <.plt>: 15 | 82cc: e52de004 push {lr} ; (str lr, [sp, #-4]!) 16 | 82d0: e59fe004 ldr lr, [pc, #4] ; 82dc <_init+0x1c> 17 | 82d4: e08fe00e add lr, pc, lr 18 | 82d8: e5bef008 ldr pc, [lr, #8]! 19 | 82dc: 00008d24 .word 0x00008d24 20 | 82e0: e28fc600 add ip, pc, #0, 12 21 | 82e4: e28cca08 add ip, ip, #8, 20 ; 0x8000 22 | 82e8: e5bcfd24 ldr pc, [ip, #3364]! ; 0xd24 23 | 82ec: e28fc600 add ip, pc, #0, 12 24 | 82f0: e28cca08 add ip, ip, #8, 20 ; 0x8000 25 | 82f4: e5bcfd1c ldr pc, [ip, #3356]! ; 0xd1c 26 | 82f8: 4778 bx pc 27 | 82fa: 46c0 nop ; (mov r8, r8) 28 | 82fc: e28fc600 add ip, pc, #0, 12 29 | 8300: e28cca08 add ip, ip, #8, 20 ; 0x8000 30 | 8304: e5bcfd10 ldr pc, [ip, #3344]! ; 0xd10 31 | 8308: e28fc600 add ip, pc, #0, 12 32 | 830c: e28cca08 add ip, ip, #8, 20 ; 0x8000 33 | 8310: e5bcfd08 ldr pc, [ip, #3336]! ; 0xd08 34 | 35 | Disassembly of section .text: 36 | 37 | 00008314 <_start>: 38 | 8314: f04f 0b00 mov.w fp, #0 39 | 8318: f04f 0e00 mov.w lr, #0 40 | 831c: f85d 1b04 ldr.w r1, [sp], #4 41 | 8320: 466a mov r2, sp 42 | 8322: f84d 2d04 str.w r2, [sp, #-4]! 43 | 8326: f84d 0d04 str.w r0, [sp, #-4]! 44 | 832a: f8df c014 ldr.w ip, [pc, #20] ; 8340 <_start+0x2c> 45 | 832e: f84d cd04 str.w ip, [sp, #-4]! 46 | 8332: 4804 ldr r0, [pc, #16] ; (8344 <_start+0x30>) 47 | 8334: 4b04 ldr r3, [pc, #16] ; (8348 <_start+0x34>) 48 | 8336: f7ff efda blx 82ec <_init+0x2c> 49 | 833a: f7ff efe6 blx 8308 <_init+0x48> 50 | 833e: 0000 .short 0x0000 51 | 8340: 00008485 .word 0x00008485 52 | 8344: 0000838d .word 0x0000838d 53 | 8348: 00008441 .word 0x00008441 54 | 55 | 0000834c : 56 | 834c: 4b03 ldr r3, [pc, #12] ; (835c ) 57 | 834e: 4a04 ldr r2, [pc, #16] ; (8360 ) 58 | 8350: 447b add r3, pc 59 | 8352: 589b ldr r3, [r3, r2] 60 | 8354: b10b cbz r3, 835a 61 | 8356: f7ff bfcf b.w 82f8 <_init+0x38> 62 | 835a: 4770 bx lr 63 | 835c: 00008cac .word 0x00008cac 64 | 8360: 0000001c .word 0x0000001c 65 | 66 | 00008364 <__do_global_dtors_aux>: 67 | 8364: 4b02 ldr r3, [pc, #8] ; (8370 <__do_global_dtors_aux+0xc>) 68 | 8366: 781a ldrb r2, [r3, #0] 69 | 8368: b90a cbnz r2, 836e <__do_global_dtors_aux+0xa> 70 | 836a: 2201 movs r2, #1 71 | 836c: 701a strb r2, [r3, #0] 72 | 836e: 4770 bx lr 73 | 8370: 00011028 .word 0x00011028 74 | 75 | 00008374 : 76 | 8374: 4803 ldr r0, [pc, #12] ; (8384 ) 77 | 8376: b508 push {r3, lr} 78 | 8378: 6803 ldr r3, [r0, #0] 79 | 837a: b113 cbz r3, 8382 80 | 837c: 4b02 ldr r3, [pc, #8] ; (8388 ) 81 | 837e: b103 cbz r3, 8382 82 | 8380: 4798 blx r3 83 | 8382: bd08 pop {r3, pc} 84 | 8384: 00010f14 .word 0x00010f14 85 | 8388: 00000000 .word 0x00000000 86 | 87 | 0000838c
: 88 | 838c: b590 push {r4, r7, lr} 89 | 838e: b085 sub sp, #20 90 | 8390: af00 add r7, sp, #0 91 | 8392: f04f 0308 mov.w r3, #8 92 | 8396: 60bb str r3, [r7, #8] 93 | 8398: f04f 0309 mov.w r3, #9 94 | 839c: 607b str r3, [r7, #4] 95 | 839e: f3ef 8400 mrs r4, CPSR 96 | 83a2: 603c str r4, [r7, #0] 97 | 83a4: 68ba ldr r2, [r7, #8] 98 | 83a6: 687b ldr r3, [r7, #4] 99 | 83a8: 4053 eors r3, r2 100 | 83aa: 2b00 cmp r3, #0 101 | 83ac: dd05 ble.n 83ba 102 | 83ae: 68b8 ldr r0, [r7, #8] 103 | 83b0: 6879 ldr r1, [r7, #4] 104 | 83b2: f000 f829 bl 8408 105 | 83b6: 60f8 str r0, [r7, #12] 106 | 83b8: e004 b.n 83c4 107 | 83ba: 6878 ldr r0, [r7, #4] 108 | 83bc: 68b9 ldr r1, [r7, #8] 109 | 83be: f000 f831 bl 8424 110 | 83c2: 60f8 str r0, [r7, #12] 111 | 83c4: f248 4394 movw r3, #33940 ; 0x8494 112 | 83c8: f2c0 0300 movt r3, #0 113 | 83cc: 4618 mov r0, r3 114 | 83ce: 68f9 ldr r1, [r7, #12] 115 | 83d0: f7ff ef86 blx 82e0 <_init+0x20> 116 | 83d4: f248 43a4 movw r3, #33956 ; 0x84a4 117 | 83d8: f2c0 0300 movt r3, #0 118 | 83dc: 4618 mov r0, r3 119 | 83de: 6839 ldr r1, [r7, #0] 120 | 83e0: f7ff ef7e blx 82e0 <_init+0x20> 121 | 83e4: f3ef 8400 mrs r4, CPSR 122 | 83e8: 603c str r4, [r7, #0] 123 | 83ea: f248 43c4 movw r3, #33988 ; 0x84c4 124 | 83ee: f2c0 0300 movt r3, #0 125 | 83f2: 4618 mov r0, r3 126 | 83f4: 6839 ldr r1, [r7, #0] 127 | 83f6: f7ff ef74 blx 82e0 <_init+0x20> 128 | 83fa: f04f 0300 mov.w r3, #0 129 | 83fe: 4618 mov r0, r3 130 | 8400: f107 0714 add.w r7, r7, #20 131 | 8404: 46bd mov sp, r7 132 | 8406: bd90 pop {r4, r7, pc} 133 | 134 | 00008408 : 135 | 8408: b480 push {r7} 136 | 840a: b083 sub sp, #12 137 | 840c: af00 add r7, sp, #0 138 | 840e: 6078 str r0, [r7, #4] 139 | 8410: 6039 str r1, [r7, #0] 140 | 8412: 687a ldr r2, [r7, #4] 141 | 8414: 683b ldr r3, [r7, #0] 142 | 8416: 18d3 adds r3, r2, r3 143 | 8418: 4618 mov r0, r3 144 | 841a: f107 070c add.w r7, r7, #12 145 | 841e: 46bd mov sp, r7 146 | 8420: bc80 pop {r7} 147 | 8422: 4770 bx lr 148 | 149 | 00008424 : 150 | 8424: b480 push {r7} 151 | 8426: b083 sub sp, #12 152 | 8428: af00 add r7, sp, #0 153 | 842a: 6078 str r0, [r7, #4] 154 | 842c: 6039 str r1, [r7, #0] 155 | 842e: 687a ldr r2, [r7, #4] 156 | 8430: 683b ldr r3, [r7, #0] 157 | 8432: 1ad3 subs r3, r2, r3 158 | 8434: 4618 mov r0, r3 159 | 8436: f107 070c add.w r7, r7, #12 160 | 843a: 46bd mov sp, r7 161 | 843c: bc80 pop {r7} 162 | 843e: 4770 bx lr 163 | 164 | 00008440 <__libc_csu_init>: 165 | 8440: e92d 43f8 stmdb sp!, {r3, r4, r5, r6, r7, r8, r9, lr} 166 | 8444: 4606 mov r6, r0 167 | 8446: f8df 9034 ldr.w r9, [pc, #52] ; 847c <__libc_csu_init+0x3c> 168 | 844a: 460f mov r7, r1 169 | 844c: 4d0c ldr r5, [pc, #48] ; (8480 <__libc_csu_init+0x40>) 170 | 844e: 4690 mov r8, r2 171 | 8450: 44f9 add r9, pc 172 | 8452: f7ff ff35 bl 82c0 <_init> 173 | 8456: 447d add r5, pc 174 | 8458: ebc5 0909 rsb r9, r5, r9 175 | 845c: ea5f 09a9 movs.w r9, r9, asr #2 176 | 8460: d009 beq.n 8476 <__libc_csu_init+0x36> 177 | 8462: 2400 movs r4, #0 178 | 8464: f855 3b04 ldr.w r3, [r5], #4 179 | 8468: 4630 mov r0, r6 180 | 846a: 4639 mov r1, r7 181 | 846c: 4642 mov r2, r8 182 | 846e: 3401 adds r4, #1 183 | 8470: 4798 blx r3 184 | 8472: 454c cmp r4, r9 185 | 8474: d1f6 bne.n 8464 <__libc_csu_init+0x24> 186 | 8476: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc} 187 | 847a: bf00 nop 188 | 847c: 00008abc .word 0x00008abc 189 | 8480: 00008ab2 .word 0x00008ab2 190 | 191 | 00008484 <__libc_csu_fini>: 192 | 8484: 4770 bx lr 193 | 8486: bf00 nop 194 | 195 | Disassembly of section .fini: 196 | 197 | 00008488 <_fini>: 198 | 8488: b508 push {r3, lr} 199 | 848a: bf00 nop 200 | 848c: bd08 pop {r3, pc} 201 | --------------------------------------------------------------------------------