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