diff --git a/20230418/Makefile b/20230418/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..7ae33df99f68fcf460324cfbb008f3f7a3863638 --- /dev/null +++ b/20230418/Makefile @@ -0,0 +1,8 @@ +%.elf: %.c + avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@ + +%.hex: %.elf + avr-objcopy -O ihex $< $@ + +download: + ./download.sh diff --git a/20230418/blink-01.c b/20230418/blink-01.c new file mode 100644 index 0000000000000000000000000000000000000000..16f34fc9dcbc5aa686b879e0c5cf1d8c10a446ee --- /dev/null +++ b/20230418/blink-01.c @@ -0,0 +1,18 @@ +#include <avr/io.h> + +#define F_CPU 8000000 +#include <util/delay.h> + +int main (void) +{ + DDRB = 0xff; // alle 8 Ausgänge als Outputs verwenden ("pinMode" für alle 8) + PORTB = 0x20; // Bit Nr. 5 auf 1 setzen, alle anderen auf 0 ("digitalWrite" für alle 8) + while (1) + { + _delay_ms (500); + PORTB = 0x00; + _delay_ms (500); + PORTB = 0x20; + } + return 0; +} diff --git a/20230418/blink-01.hex b/20230418/blink-01.hex new file mode 100644 index 0000000000000000000000000000000000000000..bf73a0d621c3419d3d1bd993cd9807885c6edc85 --- /dev/null +++ b/20230418/blink-01.hex @@ -0,0 +1,13 @@ +:100000000C9434000C943E000C943E000C943E0082 +:100010000C943E000C943E000C943E000C943E0068 +:100020000C943E000C943E000C943E000C943E0058 +:100030000C943E000C943E000C943E000C943E0048 +:100040000C943E000C943E000C943E000C943E0038 +:100050000C943E000C943E000C943E000C943E0028 +:100060000C943E000C943E0011241FBECFEFD8E04C +:10007000DEBFCDBF0E9440000C9458000C940000DD +:100080008FEF84B980E285B92FEF34E39CE02150F3 +:1000900030409040E1F700C0000015B82FEF34E386 +:1000A0009CE0215030409040E1F700C00000EBCFD1 +:0400B000F894FFCFF2 +:00000001FF diff --git a/20230418/blink-01.s b/20230418/blink-01.s new file mode 100644 index 0000000000000000000000000000000000000000..007702acb8feffd42efaae15cb4ed6c73567ae02 --- /dev/null +++ b/20230418/blink-01.s @@ -0,0 +1,41 @@ + .file "blink-01.c" +__SP_H__ = 0x3e +__SP_L__ = 0x3d +__SREG__ = 0x3f +__tmp_reg__ = 0 +__zero_reg__ = 1 + .section .text.startup,"ax",@progbits +.global main + .type main, @function +main: +/* prologue: function */ +/* frame size = 0 */ +/* stack size = 0 */ +.L__stack_usage = 0 + ldi r24,lo8(-1) ; #include <avr/io.h> + out 0x4,r24 ; + ldi r24,lo8(32) ; #define F_CPU 8000000 +.L3: ; #include <util/delay.h> + out 0x5,r24 ; + ldi r18,lo8(799999) ; int main (void) + ldi r19,hi8(799999) ; { + ldi r25,hlo8(799999) ; DDRB = 0xff; // alle 8 Ausgänge als Outputs verwenden ("pinMode" für alle 8) +1: subi r18,1 ; PORTB = 0x20; // Bit Nr. 5 auf 1 setzen, alle anderen auf 0 ("digitalWrite" für alle 8) + sbci r19,0 ; while (1) + sbci r25,0 ; { + brne 1b ; _delay_ms (500); + rjmp . ; PORTB = 0x00; + nop ; _delay_ms (500); + out 0x5,__zero_reg__ ; PORTB = 0x20; + ldi r18,lo8(799999) ; } + ldi r19,hi8(799999) ; return 0; + ldi r25,hlo8(799999) ; } +1: subi r18,1 + sbci r19,0 + sbci r25,0 + brne 1b + rjmp . + nop + rjmp .L3 + .size main, .-main + .ident "GCC: (GNU) 5.4.0" diff --git a/20230418/blink-01.s0 b/20230418/blink-01.s0 new file mode 100644 index 0000000000000000000000000000000000000000..ae625e1cbf1ca55ecbb16ba76c9896c0680e8f94 --- /dev/null +++ b/20230418/blink-01.s0 @@ -0,0 +1,295 @@ + .file "blink-01.c" +__SP_H__ = 0x3e +__SP_L__ = 0x3d +__SREG__ = 0x3f +__tmp_reg__ = 0 +__zero_reg__ = 1 +.global __mulsf3 +.global __ltsf2 +.global __gtsf2 +.global __fixunssfsi + .text +.global main + .type main, @function +main: ; #include <avr/io.h> + push r28 ; + push r29 ; #define F_CPU 8000000 + in r28,__SP_L__ ; #include <util/delay.h> + in r29,__SP_H__ ; + sbiw r28,28 ; int main (void) + in __tmp_reg__,__SREG__ ; { + cli ; DDRB = 0xff; // alle 8 Ausgänge als Outputs verwenden ("pinMode" für alle 8) + out __SP_H__,r29 ; PORTB = 0x20; // Bit Nr. 5 auf 1 setzen, alle anderen auf 0 ("digitalWrite" für alle 8) + out __SREG__,__tmp_reg__ ; while (1) + out __SP_L__,r28 ; { +/* prologue: function */ ; _delay_ms (500); +/* frame size = 28 */ ; PORTB = 0x00; +/* stack size = 30 */ ; _delay_ms (500); +.L__stack_usage = 30 ; PORTB = 0x20; + ldi r24,lo8(36) ; } + ldi r25,0 ; return 0; + ldi r18,lo8(-1) ; } + movw r30,r24 + st Z,r18 + ldi r24,lo8(37) + ldi r25,0 + ldi r18,lo8(32) + movw r30,r24 + st Z,r18 +.L18: + ldi r24,0 + ldi r25,0 + ldi r26,lo8(-6) + ldi r27,lo8(67) + std Y+1,r24 + std Y+2,r25 + std Y+3,r26 + std Y+4,r27 + ldi r18,0 + ldi r19,0 + ldi r20,lo8(-6) + ldi r21,lo8(68) + ldd r22,Y+1 + ldd r23,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + call __mulsf3 + movw r26,r24 + movw r24,r22 + std Y+19,r24 + std Y+20,r25 + std Y+21,r26 + std Y+22,r27 + ldi r18,0 + ldi r19,0 + ldi r20,lo8(-128) + ldi r21,lo8(63) + ldd r22,Y+19 + ldd r23,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + call __ltsf2 + tst r24 + brge .L23 + ldi r24,lo8(1) + ldi r25,0 + std Y+24,r25 + std Y+23,r24 + rjmp .L4 +.L23: + ldi r18,0 + ldi r19,lo8(-1) + ldi r20,lo8(127) + ldi r21,lo8(71) + ldd r22,Y+19 + ldd r23,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + call __gtsf2 + cp __zero_reg__,r24 + brge .L24 + ldi r18,0 + ldi r19,0 + ldi r20,lo8(32) + ldi r21,lo8(65) + ldd r22,Y+1 + ldd r23,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + call __mulsf3 + movw r26,r24 + movw r24,r22 + movw r22,r24 + movw r24,r26 + call __fixunssfsi + movw r26,r24 + movw r24,r22 + std Y+24,r25 + std Y+23,r24 + rjmp .L7 +.L8: + ldi r24,lo8(-56) + ldi r25,0 + std Y+26,r25 + std Y+25,r24 + ldd r24,Y+25 + ldd r25,Y+26 +/* #APP */ + ; 105 "/usr/lib/avr/include/util/delay_basic.h" 1 + 1: sbiw r24,1 + brne 1b + ; 0 "" 2 +/* #NOAPP */ + std Y+26,r25 + std Y+25,r24 + ldd r24,Y+23 + ldd r25,Y+24 + sbiw r24,1 + std Y+24,r25 + std Y+23,r24 +.L7: + ldd r24,Y+23 + ldd r25,Y+24 + or r24,r25 + brne .L8 + rjmp .L9 +.L24: + ldd r22,Y+19 + ldd r23,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + call __fixunssfsi + movw r26,r24 + movw r24,r22 + std Y+24,r25 + std Y+23,r24 +.L4: + ldd r24,Y+23 + ldd r25,Y+24 + std Y+28,r25 + std Y+27,r24 + ldd r24,Y+27 + ldd r25,Y+28 +/* #APP */ + ; 105 "/usr/lib/avr/include/util/delay_basic.h" 1 + 1: sbiw r24,1 + brne 1b + ; 0 "" 2 +/* #NOAPP */ + std Y+28,r25 + std Y+27,r24 +.L9: + ldi r24,lo8(37) + ldi r25,0 + movw r30,r24 + st Z,__zero_reg__ + ldi r24,0 + ldi r25,0 + ldi r26,lo8(-6) + ldi r27,lo8(67) + std Y+5,r24 + std Y+6,r25 + std Y+7,r26 + std Y+8,r27 + ldi r18,0 + ldi r19,0 + ldi r20,lo8(-6) + ldi r21,lo8(68) + ldd r22,Y+5 + ldd r23,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + call __mulsf3 + movw r26,r24 + movw r24,r22 + std Y+9,r24 + std Y+10,r25 + std Y+11,r26 + std Y+12,r27 + ldi r18,0 + ldi r19,0 + ldi r20,lo8(-128) + ldi r21,lo8(63) + ldd r22,Y+9 + ldd r23,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + call __ltsf2 + tst r24 + brge .L25 + ldi r24,lo8(1) + ldi r25,0 + std Y+14,r25 + std Y+13,r24 + rjmp .L12 +.L25: + ldi r18,0 + ldi r19,lo8(-1) + ldi r20,lo8(127) + ldi r21,lo8(71) + ldd r22,Y+9 + ldd r23,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + call __gtsf2 + cp __zero_reg__,r24 + brge .L26 + ldi r18,0 + ldi r19,0 + ldi r20,lo8(32) + ldi r21,lo8(65) + ldd r22,Y+5 + ldd r23,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + call __mulsf3 + movw r26,r24 + movw r24,r22 + movw r22,r24 + movw r24,r26 + call __fixunssfsi + movw r26,r24 + movw r24,r22 + std Y+14,r25 + std Y+13,r24 + rjmp .L15 +.L16: + ldi r24,lo8(-56) + ldi r25,0 + std Y+16,r25 + std Y+15,r24 + ldd r24,Y+15 + ldd r25,Y+16 +/* #APP */ + ; 105 "/usr/lib/avr/include/util/delay_basic.h" 1 + 1: sbiw r24,1 + brne 1b + ; 0 "" 2 +/* #NOAPP */ + std Y+16,r25 + std Y+15,r24 + ldd r24,Y+13 + ldd r25,Y+14 + sbiw r24,1 + std Y+14,r25 + std Y+13,r24 +.L15: + ldd r24,Y+13 + ldd r25,Y+14 + or r24,r25 + brne .L16 + rjmp .L17 +.L26: + ldd r22,Y+9 + ldd r23,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + call __fixunssfsi + movw r26,r24 + movw r24,r22 + std Y+14,r25 + std Y+13,r24 +.L12: + ldd r24,Y+13 + ldd r25,Y+14 + std Y+18,r25 + std Y+17,r24 + ldd r24,Y+17 + ldd r25,Y+18 +/* #APP */ + ; 105 "/usr/lib/avr/include/util/delay_basic.h" 1 + 1: sbiw r24,1 + brne 1b + ; 0 "" 2 +/* #NOAPP */ + std Y+18,r25 + std Y+17,r24 +.L17: + ldi r24,lo8(37) + ldi r25,0 + ldi r18,lo8(32) + movw r30,r24 + st Z,r18 + rjmp .L18 + .size main, .-main + .ident "GCC: (GNU) 5.4.0" diff --git a/20230418/calc-01.c b/20230418/calc-01.c new file mode 100644 index 0000000000000000000000000000000000000000..6791fea72774e2268c841825ae37c1b08200c72f --- /dev/null +++ b/20230418/calc-01.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +int main (void) +{ + int a = 3; + int b = 7; + int c = a + b; + printf ("c = %d\n", c); + return 0; +} diff --git a/20230418/calc-01.s b/20230418/calc-01.s new file mode 100644 index 0000000000000000000000000000000000000000..84e3c202702e6e922ec409b18c7340a600bc69d6 --- /dev/null +++ b/20230418/calc-01.s @@ -0,0 +1,26 @@ + .file "calc-01.c" + .text + .section .rodata.str1.1,"aMS",@progbits,1 +.LC0: + .string "c = %d\n" + .text + .globl main + .type main, @function +main: +.LFB11: + .cfi_startproc ; #include <stdio.h> + subq $8, %rsp ; + .cfi_def_cfa_offset 16 ; int main (void) + movl $10, %esi ; { + leaq .LC0(%rip), %rdi ; int a = 3; + movl $0, %eax ; int b = 7; + call printf@PLT ; int c = a + b; + movl $0, %eax ; printf ("c = %d\n", c); + addq $8, %rsp ; return 0; + .cfi_def_cfa_offset 8 ; } + ret + .cfi_endproc +.LFE11: + .size main, .-main + .ident "GCC: (Debian 8.3.0-6) 8.3.0" + .section .note.GNU-stack,"",@progbits diff --git a/20230418/calc-01.s0 b/20230418/calc-01.s0 new file mode 100644 index 0000000000000000000000000000000000000000..e0f8564fa52fb91f9eef7c1ba769a6aa5c794da0 --- /dev/null +++ b/20230418/calc-01.s0 @@ -0,0 +1,37 @@ + .file "calc-01.c" + .text + .section .rodata +.LC0: + .string "c = %d\n" + .text + .globl main + .type main, @function +main: +.LFB0: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 ; #include <stdio.h> + subq $16, %rsp ; + movl $3, -4(%rbp) ; int main (void) + movl $7, -8(%rbp) ; { + movl -4(%rbp), %edx ; int a = 3; + movl -8(%rbp), %eax ; int b = 7; + addl %edx, %eax ; int c = a + b; + movl %eax, -12(%rbp) ; printf ("c = %d\n", c); + movl -12(%rbp), %eax ; return 0; + movl %eax, %esi ; } + leaq .LC0(%rip), %rdi + movl $0, %eax + call printf@PLT + movl $0, %eax + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE0: + .size main, .-main + .ident "GCC: (Debian 8.3.0-6) 8.3.0" + .section .note.GNU-stack,"",@progbits diff --git a/20230418/calc-02.c b/20230418/calc-02.c new file mode 100644 index 0000000000000000000000000000000000000000..0db41dca4029f53c6857d0cc15e786354f131c6c --- /dev/null +++ b/20230418/calc-02.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +int main (void) +{ + volatile int a = 3; + volatile int b = 7; + volatile int c = a + b; + printf ("c = %d\n", c); + return 0; +} diff --git a/20230418/calc-02.s b/20230418/calc-02.s new file mode 100644 index 0000000000000000000000000000000000000000..30a87eb9b9721ebeaff6cd1362c33612fc7b243b --- /dev/null +++ b/20230418/calc-02.s @@ -0,0 +1,32 @@ + .file "calc-02.c" + .text + .section .rodata.str1.1,"aMS",@progbits,1 +.LC0: + .string "c = %d\n" + .text + .globl main + .type main, @function +main: +.LFB11: + .cfi_startproc + subq $24, %rsp + .cfi_def_cfa_offset 32 ; #include <stdio.h> + movl $3, 12(%rsp) ; + movl $7, 8(%rsp) ; int main (void) + movl 12(%rsp), %eax ; { + movl 8(%rsp), %edx ; volatile int a = 3; + addl %edx, %eax ; volatile int b = 7; + movl %eax, 4(%rsp) ; volatile int c = a + b; + movl 4(%rsp), %esi ; printf ("c = %d\n", c); + leaq .LC0(%rip), %rdi ; return 0; + movl $0, %eax ; } + call printf@PLT + movl $0, %eax + addq $24, %rsp + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE11: + .size main, .-main + .ident "GCC: (Debian 8.3.0-6) 8.3.0" + .section .note.GNU-stack,"",@progbits diff --git a/20230418/calc-03.c b/20230418/calc-03.c new file mode 100644 index 0000000000000000000000000000000000000000..19b5aaa588781fea370749d72da98dcf92b2d001 --- /dev/null +++ b/20230418/calc-03.c @@ -0,0 +1,11 @@ +#include <stdio.h> + +volatile int a = 3; +volatile int b = 7; + +int main (void) +{ + volatile static int c = a + b; + printf ("c = %d\n", c); + return 0; +} diff --git a/20230418/calc-03.s b/20230418/calc-03.s new file mode 100644 index 0000000000000000000000000000000000000000..cb1f9023b5d3f3ed899e71b5ba59476b4d2a4f16 --- /dev/null +++ b/20230418/calc-03.s @@ -0,0 +1 @@ + .file "calc-03.c" diff --git a/20230418/calc-04.c b/20230418/calc-04.c new file mode 100644 index 0000000000000000000000000000000000000000..9cdec037f23e8b46f5ab53cbc4a967bab1cf0c57 --- /dev/null +++ b/20230418/calc-04.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +volatile int a = 3; +volatile int b = 7; + +int main (void) +{ + volatile static int c; + c = a + b; + printf ("c = %d\n", c); + return 0; +} diff --git a/20230418/calc-04.s b/20230418/calc-04.s new file mode 100644 index 0000000000000000000000000000000000000000..0556a0c1488347bdda7fac848aa7d051d96ac729 --- /dev/null +++ b/20230418/calc-04.s @@ -0,0 +1,45 @@ + .file "calc-04.c" + .text + .section .rodata.str1.1,"aMS",@progbits,1 +.LC0: + .string "c = %d\n" + .text + .globl main + .type main, @function +main: +.LFB11: + .cfi_startproc + subq $8, %rsp + .cfi_def_cfa_offset 16 + movl a(%rip), %eax + movl b(%rip), %edx + addl %edx, %eax ; #include <stdio.h> + movl %eax, c.2399(%rip) ; + movl c.2399(%rip), %esi ; volatile int a = 3; + leaq .LC0(%rip), %rdi ; volatile int b = 7; + movl $0, %eax ; + call printf@PLT ; int main (void) + movl $0, %eax ; { + addq $8, %rsp ; volatile static int c; + .cfi_def_cfa_offset 8 ; c = a + b; + ret ; printf ("c = %d\n", c); + .cfi_endproc ; return 0; +.LFE11: ; } + .size main, .-main + .local c.2399 + .comm c.2399,4,4 + .globl b + .data + .align 4 + .type b, @object + .size b, 4 +b: + .long 7 + .globl a + .align 4 + .type a, @object + .size a, 4 +a: + .long 3 + .ident "GCC: (Debian 8.3.0-6) 8.3.0" + .section .note.GNU-stack,"",@progbits diff --git a/20230418/download.sh b/20230418/download.sh new file mode 100755 index 0000000000000000000000000000000000000000..770c3b5dca74ac09778be055c9d6f5adb0df293b --- /dev/null +++ b/20230418/download.sh @@ -0,0 +1,3 @@ +port=$(ls -rt /dev/ttyACM* | tail -1) +echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) +avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null diff --git a/20230418/dwarf.red b/20230418/dwarf.red new file mode 100644 index 0000000000000000000000000000000000000000..c2af9cdef5dbe8cb86409ab212bb9a503fe323e2 --- /dev/null +++ b/20230418/dwarf.red @@ -0,0 +1,15 @@ +;redcode +;name Dwarf +;author A. K. Dewdney +;strategy Throw DAT bombs around memory, hitting every 4th memory cell. +;strategy This program was presented in the first Corewar article. +;assert 1 + +bomb DAT #0 +dwarf ADD #4, bomb + MOV bomb, @bomb + JMP dwarf + END dwarf ; Programs start at the first line unless + ; an "END start" pseudo-op appears to indicate + ; the first logical instruction. Also, nothing + ; after the END instruction will be assembled. diff --git a/20230418/knirps.red b/20230418/knirps.red new file mode 100644 index 0000000000000000000000000000000000000000..befaa2a3da9a8cab5e76207623ac49880453b472 --- /dev/null +++ b/20230418/knirps.red @@ -0,0 +1,5 @@ +;name Knirps +;assert 1 + +start mov 0, 1 + end start diff --git a/20230418/logo-hochschule-bochum-cvh-text-v2.pdf b/20230418/logo-hochschule-bochum-cvh-text-v2.pdf new file mode 120000 index 0000000000000000000000000000000000000000..4aa99b8f81061aca6dcaf43eed2d9efef40555f8 --- /dev/null +++ b/20230418/logo-hochschule-bochum-cvh-text-v2.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20230418/logo-hochschule-bochum.pdf b/20230418/logo-hochschule-bochum.pdf new file mode 120000 index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1 --- /dev/null +++ b/20230418/logo-hochschule-bochum.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20230418/mice.red b/20230418/mice.red new file mode 100644 index 0000000000000000000000000000000000000000..0b17fb8c6db22239bf870c841e600a24f82a2216 --- /dev/null +++ b/20230418/mice.red @@ -0,0 +1,16 @@ +;name Mice +;author Chip Wendell +;assert 1 + +ptr dat #0 +start mov #12, ptr ; n = 12 +loop mov @ptr, <dest ; *dest = *(ptr+(*ptr)) + djn loop, ptr ; if(--ptr != 0) + ; goto loop + spl @dest ; split(*dest) + add #653, dest ; dest += 653 + jmz start, ptr ; if(!ptr) + ; goto start +dest dat #833 + + end start diff --git a/20230418/nothing.red b/20230418/nothing.red new file mode 100644 index 0000000000000000000000000000000000000000..5d6f3c21f2f19c3929c675c21b1e9a8ff47d8bf1 --- /dev/null +++ b/20230418/nothing.red @@ -0,0 +1,5 @@ +;name Nothing +;assert 1 + +start jmp 0 + end start diff --git a/20230418/pgslides.sty b/20230418/pgslides.sty new file mode 120000 index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64 --- /dev/null +++ b/20230418/pgslides.sty @@ -0,0 +1 @@ +../common/pgslides.sty \ No newline at end of file diff --git a/20230418/rtech-20230418.pdf b/20230418/rtech-20230418.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0913ab92893bd5c2dbd7bcc0e9f72181d29ae306 Binary files /dev/null and b/20230418/rtech-20230418.pdf differ diff --git a/20230418/rtech-20230418.tex b/20230418/rtech-20230418.tex new file mode 100644 index 0000000000000000000000000000000000000000..b92ef5319702a756e864af0063558ac0c9c65433 --- /dev/null +++ b/20230418/rtech-20230418.tex @@ -0,0 +1,622 @@ +% rtech-20230418.pdf - Lecture Slides on Computer Technology +% Copyright (C) 2012, 2013, 2014, 2021, 2022, 2023 Peter Gerwinski +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +% README: Assembler-Programmierung + +\documentclass[10pt,t]{beamer} + +\usepackage{pgslides} +\usepackage{pdftricks} +%\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx} +%\usepackage{eurosym} +\usepackage{tikz} + +\newcommand{\Cin}{C\raisebox{-0.5ex}{\footnotesize in}} +\newcommand{\Cout}{C\raisebox{-0.5ex}{\footnotesize out}} + +\lstdefinestyle{asm}{basicstyle=\color{structure}, + language={}, + gobble=4} + +\begin{psinputs} + \usepackage[utf8]{inputenc} + \usepackage[german]{babel} + \usepackage[T1]{fontenc} + \usepackage{helvet} + \renewcommand*\familydefault{\sfdefault} + \usepackage{pstricks,pst-grad,pst-circ-pg} + \newcommand{\invisible}{\tiny\color{white}} + \psset{unit=1cm} + \psset{logicLabelstyle=\invisible} + \newcommand{\logicSymbol}{\small\boldmath\bf\rule{0pt}{0.5cm}} + \psset{logicSymbolstyle=\logicSymbol} + \newcommand{\Cin}{C\raisebox{-0.5ex}{\footnotesize in}} + \newcommand{\Cout}{C\raisebox{-0.5ex}{\footnotesize out}} +\end{psinputs} + +\title{Rechnertechnik} +\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} +\date{18.\ April 2022} + +\begin{document} + +\maketitleframe + +\nosectionnonumber{\inserttitle} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \item[\textbf{2}] \textbf{Vom Schaltkreis zum Computer} + \begin{itemize} + \item[2.1] Logik-Schaltkreise + \item[2.2] Binärdarstellung von Zahlen + \item[2.3] Vom Logik-Schaltkreis zum Addierer + \item[2.4] Negative Zahlen + \item[2.5] Weitere Rechenoperationen + \color{medgreen} + \item[2.6] Vom Addierer zum Computer + \end{itemize} + \item[\textbf{3}] \textbf{Assember-Programmierung} + \begin{itemize} + \color{red} + \item[3.1] Struktur von Assembler-Programmen + \item[3.2] Beispiel: Redcode + \item[\dots] + \end{itemize} +% \color{gray} +% \item[\textbf{3}] \textbf{Architekturmerkmale von Prozessoren} +% \item[\textbf{4}] \textbf{Der CPU-Stack} +% \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} +% \item[\textbf{6}] \textbf{Anwender-Software} +% \item[\textbf{7}] \textbf{Bus-Systeme} +% \item[\textbf{8}] \textbf{Pipelining} +% \item[\textbf{9}] \textbf{Ausblick} + \item[\textbf{\dots\hspace{-0.75em}}] + \end{itemize} + +\end{frame} + +\setcounter{section}{1} +\section{Vom Schaltkreis zum Computer} +\setcounter{subsection}{5} +\subsection{Vom Addierer zum Computer} + +\begin{frame} + + \showsubsection + + \visible<1->{Rechenwerk (ALU)} + + \bigskip + + Speicher ($n$-Bit-Speicherzellen) + \begin{itemize} + \item + Prozessorregister + \item + Adressierbarer Hauptspeicher + \end{itemize} + + \begin{onlyenv}<1> + + \bigskip + + \begin{visibleenv}<1-> + Prozessorregister + \begin{itemize} + \item + können über Schaltungen (Und-Gatter) direkt mit Ein- und Ausgängen\\ + der ALU verbunden werden \textcolor{red}{(Video: Master-Slave-D-Flipflop)} + \begin{onlyenv}<1-> + \begin{picture}(0,0) + \put(-5.6,-0.6){% + \begin{minipage}{6cm} + \begin{center} + \color{medgreen}\footnotesize + leider offizieller Name\\ + Gegenvorschlag: Primary-Secondary + \end{center} + \end{minipage}} + \end{picture} + \end{onlyenv} + \item + sehr wenige (unter 100) + \item + sehr schnell + \end{itemize} + \end{visibleenv} + + \bigskip + + \begin{visibleenv}<1-> + Adressierbarer Hauptspeicher: Speicherzellen + \begin{itemize} + \item + können über Schaltungen mit Prozessorregistern verbunden werden + \item + sehr viele (Stand 2023: mehrere Tausend bis mehrere Milliarden) + \item + Schaltkreis zum Auswählen: Decoder \textcolor{red}{(Video)} + \end{itemize} + \end{visibleenv} + + \vspace*{-10cm} + + \end{onlyenv} + + \pause + \bigskip + + Takt + \begin{itemize} + \item + Taktgeber + \item + Zähler + \arrowitem + Speicher durchgehen und Befehle abarbeiten: Maschinensprache + \end{itemize} + + \begin{onlyenv}<2> + + \smallskip + + Der \newterm{Instruction Pointer} (ein Prozessorregister) adressiert eine Speicherzelle\\ + im Hauptspeicher. Je nachdem, was sich darin befindet, wird ein Wert\\ + aus dem Hauptspeicher in ein Prozessorregister übertragen oder umgekehrt\\ + oder mit einem Prozessorregister eine Rechnung durchgeführt. + + \smallskip + + Wert aus Hauptspeicher in den Instruction Pointer übertragen + \textarrow\ Sprungbefehl\\ + Ansonsten: Instruction Pointer hochzählen + + \vspace*{-10cm} + + \end{onlyenv} + + \pause + \bigskip + + Peripherie + \begin{itemize} + \item + Output: Speicherzelle als Output-Pin nach außen führen + \item + Input: Speicherzelle durch Input-Pin ersetzen + \arrowitem + Kommunikation mit der Außenwelt + \end{itemize} + +\end{frame} + +\section{Assembler-Programmierung} +\subsection{Struktur von Assembler-Programmen} + +\begin{frame} + \showsection + \showsubsection + + Maschinenbefehl: Bits besagen, was in diesem Takt geschehen soll + + \begin{itemize} + \item + Daten aus Registern (oder Hauptspeicher) an ALU legen,\\ + Ergebnis in Register (oder Hauptspeicher) schreiben + \arrowitem + arithmetisch-logische Befehle + \item + Daten aus dem Hauptspeicher in Register einlesen + \item + Daten aus Register in den Hauptspeicher schreiben + \arrowitem + Lade- und Speicher-Befehle + \item + Daten aus Register oder Hauptspeicher in das \lstinline{IP}-Register laden + \arrowitem + (unbedingter) Sprungbefehl + \item + Sprungbefehl nur dann, wenn im Status-Ausgang der ALU\\ + ein bestimmtes Bit gesetzt ist + \arrowitem + bedingter Sprungbefehl + \bigskip + \arrowitem + Der Computer kann "`alles"' -- \newterm{Turing-Vollständigkeit} + \end{itemize} +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Maschinensprache: Bits besagen, was in diesem Takt geschehen soll + \begin{itemize} + \item + Lade- und Speicher-Befehle\\ + arithmetisch-logische Befehle\\ + unbedingte und bedingte Sprungbefehle + \arrowitem + Der Computer kann "`alles"' -- \newterm{Turing-Vollständigkeit} + \end{itemize} + + \medskip + + \newterm{Assembler\/}-Sprache + \begin{itemize} + \item + Maschinensprache = Zahlen \textarrow\ für Menschen schwer handhabbar + \arrowitem + Namen für die Befehle: \newterm{Mnemonics} + \end{itemize} + + \pause + \medskip + + Beispiele + \begin{itemize} + \item + Intel 8086 \textcolor{red}{(Screenshots: qemu/kvm, FreeDOS)} + \item + Atmel AVR \textcolor{red}{(Live: Arduino)} + \item + Intel IA-32 / AMD64 \textcolor{red}{(\lstinline[style=cmd]{gcc -S})} + \item + Redcode \textcolor{red}{(Praktikumsversuch)} + \end{itemize} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + Beispiel: IA-32-Assembler \only<3>{-- Adressierungsarten} + + \vspace{2cm} + + \begin{lstlisting} + addl $1, %eax + movb %al, b + cmpb (%ebx), %dl + jbe .L2 + \end{lstlisting} + + \begin{onlyenv}<2-3> + \begin{picture}(0,0) + \color{red} + \put(0.4,2.8){\vector(0,-1){0.7}} + \put(0.4,2.9){\makebox(0,0)[b]{Befehl}} + \only<2>{% + \put(1.4,2.8){\vector(-1,-1){0.7}} + \put(2.3,2.9){\makebox(0,0)[b]{Größen-Suffix}}} + \only<3>{% + \put(1.4,2.8){\vector(-1,-2){0.35}} + \put(1.4,2.8){\vector(1,-2){0.35}} + \put(2.0,2.9){\makebox(0,0)[b]{Operanden}}} + \end{picture} + \end{onlyenv} + \begin{onlyenv}<4> + \begin{picture}(0,0) + \color{red} + \put(1.4,2.8){\vector(-1,-2){0.35}} + \put(2.0,2.9){\makebox(0,0)[b]{unmittelbar}} + \put(3.0,1.8){\vector(-1,0){0.7}} + \put(3.1,1.8){\makebox(0,0)[l]{Register}} + \put(4.8,1.4){\vector(-1,0){2.7}} + \put(4.9,1.4){\makebox(0,0)[l]{Speicher (absolut)}} + \put(2.3,-0.0){\vector(-1,1){0.7}} + \put(3.5,-0.1){\makebox(0,0)[t]{indirekt mit Register}} + \put(0.8,-0.6){\vector(0,1){0.9}} + \put(0.0,-0.7){\makebox(0,0)[tl]{Speicher (relativ)}} + \end{picture} + \end{onlyenv} + +\end{frame} + +\subsection{Beispiel: Redcode} + +\begin{frame}[fragile] + + \showsubsection + + Beispiel: Redcode (ICWS '86) -- Core War[s] (Krieg der Kerne)\\ + Virtuelle Maschine: Memory Array Redcode Simulator (MARS) + + \bigskip + + \begin{minipage}[t]{7.2cm} + Instruktionen:\\[\smallskipamount] + \lstinline{dat B} -- Daten \only<1->{-- "`Du hast verloren!"'}\\ + \lstinline{mov A, B} -- kopiere A nach B\\ + \lstinline{add A, B} -- addiere A zu B\\ + \lstinline{sub A, B} -- subtrahiere A von B\\ + \lstinline{jmp A} -- unbedingter Sprung nach A\\ + \lstinline{jmz A, B} -- Sprung nach A, wenn B $=$ 0\\ + \lstinline{jmn A, B} -- Sprung nach A, wenn B $\ne$ 0\\ + \lstinline{djn A, B} -- "`decrement and jump if not zero"'\\ + \lstinline{cmp A, B} -- "`compare"': überspringe, falls gleich\\ + \lstinline{spl A} -- "`split"': Programm verzweigen + \end{minipage}\hfill + \begin{minipage}[t]{4.7cm} + Adressierungsarten:\\[\smallskipamount] + grundsätzlich: Speicher relativ\\[\smallskipamount] + \lstinline{#} -- unmittelbar\\ + \lstinline{$} -- direkt\\ + \lstinline{@} -- indirekt\\ + \lstinline{<} -- indirekt mit Prä-Dekrement + +% \pause[5] + \bigskip + Programm "`Nothing"': + \begin{lstlisting}[gobble=6] + jmp 0 + \end{lstlisting} +% \pause + \bigskip + Programm "`Knirps"': + \begin{lstlisting}[gobble=6] + mov 0, 1 + \end{lstlisting} + + \end{minipage} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + Unbedingte Verzweigung + + Beispiel: Endlosschleife von "`Dwarf"' + + \begin{minipage}[t]{1.2cm} + \begin{lstlisting}[style=asm,gobble=6] + bomb + start + \end{lstlisting} + \end{minipage}% + \begin{minipage}[t]{3cm} + \begin{lstlisting}[style=asm,gobble=6] + dat #0 + add #4, bomb + mov bomb, @bomb + jmp start + end start + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{3.9cm} + \small + \bigskip + Instruktionen:\\[\smallskipamount] + \lstinline{dat B}\\ + \lstinline{mov A, B}\\ + \lstinline{add A, B}\\ + \lstinline{sub A, B}\\ + \lstinline{jmp A}\\ + \lstinline{jmz A, B} -- "`jump if zero"'\\ + \lstinline{jmn A, B} -- "`if not zero"'\\ + \lstinline{djn A, B} -- "`dec. \& jmn"'\\ + \lstinline{cmp A, B} -- vgl.\ \& überspr.\\ + \lstinline{spl A} -- verzweigen + \end{minipage}% + \begin{minipage}[t]{2.7cm} + \small + \bigskip + Adressierungsarten:\\[\medskipamount] + grundsätzlich:\\ + Speicher relativ\\[\medskipamount] + \lstinline{#} -- unmittelbar\\[\smallskipamount] + \lstinline{$} -- direkt\\[\smallskipamount] + \lstinline{@} -- indirekt\\[\smallskipamount] + \lstinline{<} -- indirekt mit\\ + \hspace*{0.52cm}Prä-Decrement + \end{minipage} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + \alt<2->{Mehrere Threads}{Bedingte Verzweigung} + + Beispiel: \alt<2->{Multithreading}{Kopierschleife} von "`Mice"' + + \begin{minipage}[t]{1.2cm} + \begin{lstlisting}[style=asm,gobble=6] + ptr + start + loop + + + + + dest + + \end{lstlisting} + \end{minipage}% + \begin{minipage}[t]{3cm} + \begin{lstlisting}[style=asm,gobble=6] + dat #0 + mov #12, ptr + mov @ptr, <dest + djn loop, ptr + spl @dest + add #653, dest + jmz start, ptr + dat #833 + end start + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{3.9cm} + \small + \bigskip + Instruktionen:\\[\smallskipamount] + \lstinline{dat B}\\ + \lstinline{mov A, B}\\ + \lstinline{add A, B}\\ + \lstinline{sub A, B}\\ + \lstinline{jmp A}\\ + \lstinline{jmz A, B} -- "`jump if zero"'\\ + \lstinline{jmn A, B} -- "`if not zero"'\\ + \lstinline{djn A, B} -- "`dec. \& jmn"'\\ + \lstinline{cmp A, B} -- vgl.\ \& überspr.\\ + \lstinline{spl A} -- verzweigen + \end{minipage}% + \begin{minipage}[t]{2.7cm} + \small + \bigskip + Adressierungsarten:\\[\medskipamount] + grundsätzlich:\\ + Speicher relativ\\[\medskipamount] + \lstinline{#} -- unmittelbar\\[\smallskipamount] + \lstinline{$} -- direkt\\[\smallskipamount] + \lstinline{@} -- indirekt\\[\smallskipamount] + \lstinline{<} -- indirekt mit\\ + \hspace*{0.52cm}Prä-Decrement + \end{minipage} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + Selbstmodifizierender Code + + Beispiel: Selbsterkennung von "`Fini"' + + \begin{minipage}[t]{1.2cm} + \begin{lstlisting}[language={},gobble=6] + num + start + + pos + + \end{lstlisting} + \end{minipage}% + \begin{minipage}[t]{0.9cm} + \begin{lstlisting}[language={},gobble=6] + dat #-2 + mov num, <pos + jmp start + dat #-3 + end start + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{3.9cm} + \small + \bigskip + Instruktionen:\\[\smallskipamount] + \lstinline{dat B}\\ + \lstinline{mov A, B}\\ + \lstinline{add A, B}\\ + \lstinline{sub A, B}\\ + \lstinline{jmp A}\\ + \lstinline{jmz A, B} -- "`jump if zero"'\\ + \lstinline{jmn A, B} -- "`if not zero"'\\ + \lstinline{djn A, B} -- "`dec. \& jmn"'\\ + \lstinline{cmp A, B} -- vgl.\ \& überspr.\\ + \lstinline{spl A} -- verzweigen + \end{minipage}% + \begin{minipage}[t]{2.7cm} + \small + \bigskip + Adressierungsarten:\\[\medskipamount] + grundsätzlich:\\ + Speicher relativ\\[\medskipamount] + \lstinline{#} -- unmittelbar\\[\smallskipamount] + \lstinline{$} -- direkt\\[\smallskipamount] + \lstinline{@} -- indirekt\\[\smallskipamount] + \lstinline{<} -- indirekt mit\\ + \hspace*{0.52cm}Prä-Decrement + \end{minipage} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + \strut + + \strut\makebox(0,0)[bl]{\large\color{structure}\textbf{Praktikumsversuch}} + + \begin{minipage}[t]{5cm} + \medskip + Schreiben Sie ein\\ + Redcode-Programm,\\ + das die Gegner\\ + \file{Nothing}, \file{Knirps}\\ + und \file{Mice} besiegt. + + \medskip + + ICWS-86-Standard,\\ + max.\ 64 Prozesse,\\ + Speichergröße zufällig\\ + von 512 bis 8192 + + \medskip + + Teams bis zu 3 Personen\\ + sind zulässig. + \end{minipage}\hfill + \begin{minipage}[t]{3.9cm} + \small + \bigskip + Instruktionen:\\[\smallskipamount] + \lstinline{dat B}\\ + \lstinline{mov A, B}\\ + \lstinline{add A, B}\\ + \lstinline{sub A, B}\\ + \lstinline{jmp A}\\ + \lstinline{jmz A, B} -- "`jump if zero"'\\ + \lstinline{jmn A, B} -- "`if not zero"'\\ + \lstinline{djn A, B} -- "`dec. \& jmn"'\\ + \lstinline{cmp A, B} -- vgl.\ \& überspr.\\ + \lstinline{spl A} -- verzweigen + \end{minipage}% + \begin{minipage}[t]{2.7cm} + \small + \bigskip + Adressierungsarten:\\[\medskipamount] + grundsätzlich:\\ + Speicher relativ\\[\medskipamount] + \lstinline{#} -- unmittelbar\\[\smallskipamount] + \lstinline{$} -- direkt\\[\smallskipamount] + \lstinline{@} -- indirekt\\[\smallskipamount] + \lstinline{<} -- indirekt mit\\ + \hspace*{0.52cm}Prä-Decrement + \end{minipage} + +\end{frame} + +\end{document} diff --git a/20230418/tournament b/20230418/tournament new file mode 100755 index 0000000000000000000000000000000000000000..c3cd7e438d288b3719e47553a28c283331fba016 --- /dev/null +++ b/20230418/tournament @@ -0,0 +1,40 @@ +#!/bin/bash + +if [ -n "$1" ]; then + PARTICIPANTS="$@" +else + PARTICIPANTS=$(ls *.red) +fi + +#PARTICIPANTS="nothing.red knirps.red mice.red $1" + +PMARS="$HOME/bo/2012ws/rtech/material/pmars-0.9.2/src/pmars-ncurses" + +mars () +{ + c1=$2 + c2=$3 +# echo "$PMARS -8 -b -k -p 64 -s $1 $2 $3" + set $($PMARS -8 -b -k -p 8000 -s $1 $2 $3) +# set $($PMARS -8 -b -k -s $1 $2 $3) + if [ $1 = 1 ]; then + echo -n "***" >> $c1.score + touch $c2.score + elif [ $3 = 1 ]; then + touch $c1.score + echo -n "***" >> $c2.score + else + echo -n "+" >> $c1.score + echo -n "+" >> $c2.score + fi +} + +rm -f *.score + +./turn $PARTICIPANTS \ + | sort -R \ + | while read line; do + $line + done + +./scores