#       # 1 "uebung1.c"
#
#       # 1 "/usr/include/stdio.h"
#       # 6
#
#       # 1 "/usr/include/sys/stdsyms.h"
#       # 131
#
#       # 7 "/usr/include/stdio.h"
#       # 137
#
#       # 22
#          typedef struct {
#               int              __cnt;
#               unsigned char   *__ptr;
#               unsigned char   *__base;
#               unsigned short   __flag;
#               unsigned char    __fileL;
#               unsigned char    __fileH;
#          } FILE;
#
#          typedef struct {
#               int              __cnt;
#               unsigned char   *__ptr;
#               unsigned char   *__base;
#               unsigned short   __flag;
#               unsigned char    __fileL;
#               unsigned char    __fileH;
#               unsigned char   *__bufendp;
#               unsigned char    __smbuf[ 8 ];
#          } _FILEX;
#       # 171
#
#       # 65
#            typedef unsigned int size_t;
#
#
#          typedef long int fpos_t;
#
#
#            typedef char *__va_list;
#       # 202
#
#       # 102
#          extern FILE __iob[];
#
#
#            extern int remove(const char *);
#            extern int rename(const char *, const char *);
#            extern FILE *tmpfile(void);
#            extern char *tmpnam(char *);
#            extern int fclose(FILE *);
#            extern int fflush(FILE *);
#            extern FILE *fopen(const char *, const char *);
#            extern FILE *freopen(const char *, const char *, FILE *);
#            extern void setbuf(FILE *, char *);
#            extern int setvbuf(FILE *, char *, int, size_t);
#            extern int fprintf(FILE *, const char *, ...);
#            extern int fscanf(FILE *, const char *,...);
#            extern int printf(const char *,...);
#            extern int scanf(const char *,...);
#            extern int sprintf(char *, const char *,...);
#            extern int sscanf(const char *, const char *,...);
#            extern int vprintf(const char *, __va_list);
#            extern int vfprintf(FILE *, const char *, __va_list);
#            extern int vsprintf(char *, const char *, __va_list);
#            extern int fgetc(FILE *);
#            extern char *fgets(char *, int, FILE *);
#            extern int fputc(int, FILE *);
#            extern int fputs(const char *, FILE *);
#            extern int getc(FILE *);
#            extern int getchar(void);
#            extern char *gets(char *);
#            extern int putc(int, FILE *);
#            extern int putchar(int);
#            extern int puts(const char *);
#            extern int ungetc(int, FILE *);
#            extern int fgetpos(FILE *, fpos_t *);
#            extern int fseek(FILE *, long int, int);
#            extern int fsetpos(FILE *, const fpos_t *);
#            extern long int ftell(FILE *);
#            extern void rewind(FILE *);
#            extern void clearerr(FILE *);
#            extern int feof(FILE *);
#            extern int ferror(FILE *);
#            extern void perror(const char *);
#       # 274
#
#       # 191
#              extern size_t fread(void *, size_t, size_t, FILE *);
#              extern size_t fwrite(const void *, size_t, size_t, FILE *);
#       # 323
#
#       # 207
#            extern int __flsbuf(unsigned char, FILE *);
#            extern int __filbuf(FILE *);
#       # 300
#
#       # 2 "uebung1.c"
#       main()
#9
       global  _main
_main:
       link.l  %a6,&LF1                # Lege den Inhalt von A6 auf den Stack
                                       # und reserviere 808 Bytes auf dem
                                       # Stack
       movm.l  &LS1,(%sp)              # Speichere die Konstante LS1
                                       # in das Langwort, auf das der Stapel-
                                       # zeiger zeigt [Indirekte Adressierung]
       fmovm.x &LSF1,LFF1(%a6)         # Speichere die Konstante LSF1
                                       # ab der Adresse auf die a6 zeigt
                                       # [Indirekte Addressierung mit
                                       # Erweiterung]
#       {
       clr.l   -4(%a6)                 # Loesche das Langwort im Speicher,
                                       # das 4 Bytes vor der Adresse steht,
                                       # auf die a6 zeigt
#               int i=0;
#               int fd[10][20];
       lea     -804(%a6),%a0           # Ziehe 804 von der Adresse ab, die in
                                       # a6 steht und schreibe das Ergebnis
                                       # nach a0
       mov.l   %a0,-808(%a6)           # Schreibe a0 in die Speicherstelle,
                                       # die 808 Bytes vor derjenigen steht
                                       # auf die A6 zeigt
#               int *zeiger=(int *)fd;
L58:
#               do
       mov.l   -4(%a6),%d0             # Schreibe den Inhalt der Speicher-
                                       # stelle, die 4 Bytes vor der Stelle
                                       # liegt, auf die A6 zeigt, nach d0
       mov.l   -808(%a6),%a0           # Ziehe 808 von der Adresse ab, die in
                                       # a6 steht und schreibe das Ergebnis
                                       # nach a0
       movq    &10,%d1                 # Lade d1 mit dem Wert 10
                                       # [Umittelbar schnelle Adressierung
                                       # (mit Erweiterung des Operanden auf
                                       # Langwort)]
       mov.l   %d1,(%a0,%d0.l*4)       # Schreibe d1 in die Speicherstelle,
                                       # deren Adresse durch Addition von a0
                                       # und d0 gebildet wird
                                       # [Indirekte Adressierung mit Index
                                       # und Erweiterung (Erweiterung
                                       # hier = 0)]

       add.l   &20,-4(%a6)             # Addiere 20 zu der Adresse, die 4
                                       # Bytes vor der Adresse liegt, auf
                                       # die a6 zeigt
#                {*(zeiger + i)=10; i += 20;}
L57:
       cmp.l   -4(%a6),&200            # Vergleiche die Speicherstelle, die
                                       # 4 Bytes vor der Adresse liegt, auf
                                       # die a6 zeigt, mit dem Wert 200
       bne.l   L58                     # Wenn ungleich, dann springe nach
                                       # L58 (Branch on not equal)
L56:
#               while (i != 200);
       mov.l   -808(%a6),%a0           # Ziehe 808 von der Adresse ab, die
                                       # in a6 steht und schreibe das
                                       # Ergebnis nach a0
       mov.l   (%a0),%d0               # Lese die Speicheradresse, auf die
                                       # a0 zeigt, und schreibe ihren Inhalt
                                       # nach d0

       add.l   &10,%d0                 # Addiere 10 zu d0
       mov.l   %d0,-84(%a6)            # Schreibe d0 in die Speicherstelle,
                                       # die 84 Bytes vor derjenigen steht
                                       # auf die A6 zeigt
#               fd[9][0]=*zeiger +10;
       mov.l   -84(%a6),-(%sp)         # Lege den Inhalt der Speicherstelle,
                                       # die 84 Bytes vor der Stelle liegt,
                                       # auf die A6 zeigt, auf den Stack
       mov.l   -804(%a6),-(%sp)        # Lege den Inhalt der Speicherstelle,
                                       # die 804 Bytes vor der Stelle liegt,
                                       # auf die A6 zeigt, auf den Stack

       pea     L59                     # Lege die Adresse, ab der die Daten
                                       # (mit dem Label L59) stehen, auf den
                                        Stack
       jsr     _printf                 # Rufe die Funktion _printf auf
       lea     12(%sp),%sp             # Gibt 3 Langwoerter auf dem Stack
                                       # frei

#               printf("%i %i \n", fd[0][0], fd[9][0]);
L55:
       unlk    %a6                     # Gib den reservierten Speicherbereich
                                       # auf dem Stack frei und schreibe
                                       # vorherigen Wert in A6 zurueck
       rts                             # Ruecksprung in aufrufendes Programm
                                       # (Return from subroutine)

       set     LF1,-808                # Weise der Konstanten LF1 -808 zu
       set     LS1,0                   # Weise der Konstanten LS1 0 zu
       set     LFF1,-808               # Weise der Konstanten LFF1 -808 zu
       set     LSF1,0                  # Weise der Konstanten LSF1 0 zu
#       }
       data
L59:
       byte    37,105,32,37,105,32,10,0
       version 2

#
# Indirekte Adressierung:
# Es wird der Operand von/zu der Adresse uebertragen, die das Adress-
# register angibt.
#
# Indirekte Adressierung mit Erweiterung:
# Wie indirekte Adressierung, jedoch wird, bevor der Operand uebertragen
# wird, die Erweiterung (das ist eine Konstante) zur Adresse addiert
#
# Indirekte Adressierung mit Index und Erweiterung:
# Wie indirekte Adressierung mit Erweiterung, jedoch wird, bevor der Operand
# uebretragen wird, das Indexregister zur Adresse addiert
#
# Unmittelbar schnelle Adressierung:
# Der Quelloperand ist im Opcode enthalten. Daher ist eine sehr schnelle Ab-
# arbeitung desb Befehls moeglich. Der Quelloperand wird dabei immer auf
# Langwortlaenge erweitert (mit Nullen)
#