summaryrefslogtreecommitdiff
path: root/support/tiny_c2l/asm_uebung.s
blob: 413460140bcc2c683140c9c7ca74851039178acf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#	# 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)
#