#	# 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)
#
