Produced from asm uebung.s on 25–Feb–2000 08:39

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

#