diff --git a/20220531/blink-asm-05.S b/20220531/blink-asm-05.S new file mode 100644 index 0000000000000000000000000000000000000000..f147f7b6925f5b7d549c946009f564e665bd876b --- /dev/null +++ b/20220531/blink-asm-05.S @@ -0,0 +1,53 @@ + .file "blink.c" +__SP_H__ = 0x3e +__SP_L__ = 0x3d +__SREG__ = 0x3f +__tmp_reg__ = 0 +__zero_reg__ = 1 + .section .text.startup,"ax",@progbits +.global pruzzel + .type pruzzel, @function +pruzzel: +/* prologue: function */ +/* frame size = 0 */ +/* stack size = 0 */ +.L__stack_usage = 0 + + ldi r24,0xff /* Lade die Zahl 0xff (unmittelbar - immediately) in das Register r24 */ + sts 0x24,r24 /* Speichere das Register r24 in der Speicherzelle Nr. 0x24 (= DDRB) */ + /* --> Wir verwenden alle 8 Bit von PORTB als Outputs. */ + +.L3: /* Hier beginnt die Endlosschleife. */ + + sts 0x25,__zero_reg__ /* Speichere ein Register mit dem Inhalt 0 in der Speicherzelle Nr. 0x25 (= PORTB) --> alle LEDs aus */ + + ldi r18,lo8(799999) /* Warte 0.5 Sekunden: zähle von 799999 bis 0 */ + ldi r19,hi8(799999) /* Jeder Assembler-Befehl dauert 1 Takt = 1 / 16000000 Sekunde */ + ldi r25,hlo8(799999) /* Wir haben ausgerechnet, daß dann die ganze Schleife ziemlich genau */ +1: subi r18,1 /* 0.5 Sekunden dauert. */ + sbci r19,0 + sbci r25,0 + brne 1b /* Ende der Schleife */ + rjmp . /* 2 Befehle, die nichts tun: auf genau 0.5 Sekunden aufrunden */ + nop + + /* Schalte die rote LED ein */ + /* In C: PORTB |= 0x10 */ + lds r24,0x25 /* Register r24 von Speicherzelle 0x25 laden */ + ori r24,0x10 /* Register r24 mit Maske Oder-verknüpfen */ + sts 0x25,r24 /* Register r24 an Speicherzelle 0x25 speichern */ + + ldi r18,lo8(799999) /* 0.5 Sekunden warten */ + ldi r19,hi8(799999) + ldi r25,hlo8(799999) +1: subi r18,1 + sbci r19,0 + sbci r25,0 + brne 1b + rjmp . + nop + + rjmp .L3 /* Sprung nach oben: Endlosschleife */ + + .size pruzzel, .-pruzzel + .ident "GCC: (GNU) 5.4.0" diff --git a/20220531/rtech-20220531.txt b/20220531/rtech-20220531.txt index c1288d395115ac5d82f875897edbf792efccb736..6dd989c47148d2bf9d661a222cb1d6e1d0782b9b 100644 --- a/20220531/rtech-20220531.txt +++ b/20220531/rtech-20220531.txt @@ -2,3 +2,8 @@ Aus dem Datenblatt des ATMega 328P, Seite 615, erfahren wir: Die Variable DDRD liegt an Speicherzelle 0x2a. Die Variable PORTD liegt an Speicherzelle 0x2b. + + +Aufgabe für nächste Woche: +Programmiere eine Verkehrsampel (rot, rot-gelb, grün, gelb, Schleife) +auf einem ATMega-Prozessor (Arduino) in Assembler. diff --git a/20220531/variables-03.c b/20220531/variables-03.c new file mode 100644 index 0000000000000000000000000000000000000000..82a0bd272056abb7d328c66ce28fa39743b33877 --- /dev/null +++ b/20220531/variables-03.c @@ -0,0 +1,10 @@ +#include <stdint.h> + +uint8_t x = 3; + +int main (void) +{ + x |= 6; + x &= 4; + return 1117; +} diff --git a/20220531/variables-03.s0 b/20220531/variables-03.s0 new file mode 100644 index 0000000000000000000000000000000000000000..98d1defe057d5d7aadb0c3da9d3777437e80fd5e --- /dev/null +++ b/20220531/variables-03.s0 @@ -0,0 +1,39 @@ + .file "variables-03.c" +__SP_H__ = 0x3e +__SP_L__ = 0x3d +__SREG__ = 0x3f +__tmp_reg__ = 0 +__zero_reg__ = 1 +.global x + .data + .type x, @object + .size x, 1 +x: + .byte 3 + .text +.global main + .type main, @function +main: + push r28 + push r29 + in r28,__SP_L__ + in r29,__SP_H__ +/* prologue: function */ +/* frame size = 0 */ +/* stack size = 2 */ +.L__stack_usage = 2 + lds r24,x + ori r24,lo8(6) + sts x,r24 + lds r24,x + andi r24,lo8(4) + sts x,r24 + ldi r24,lo8(93) + ldi r25,lo8(4) +/* epilogue start */ + pop r29 + pop r28 + ret + .size main, .-main + .ident "GCC: (GNU) 5.4.0" +.global __do_copy_data diff --git a/20220531/variables-03.ss b/20220531/variables-03.ss new file mode 100644 index 0000000000000000000000000000000000000000..ef5f74caf8dd078b2dde95d91ebded6c02b7e242 --- /dev/null +++ b/20220531/variables-03.ss @@ -0,0 +1,28 @@ + .file "variables-03.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(4) + sts x,r24 + ldi r24,lo8(93) + ldi r25,lo8(4) + ret + .size main, .-main +.global x + .data + .type x, @object + .size x, 1 +x: + .byte 3 + .ident "GCC: (GNU) 5.4.0" +.global __do_copy_data