Syschdemnahe Programmierung in C: Madrize als oidimensionale Felder
Systemnahe Programmierung in Chome Syschdemnahe Programmierung in C: Madrize als oidimensionale Felder Prof. Dr. Uwe Schmidt FH Wedel

Madrize als oidimensionale Felder

weiter

weiter

Imblemendierung vo Madrize

Madrize
müsse für oi oifache und flexible Paramederübergab linearisierd werde, also in oidimensionale Felderet abgeschbeicherd werde. Nur so könne sie mid allgemoi oisedzbare Funkzione verarbeided werde.
 
Dis führd daz, dess d indizierde Zugriff immr oi Muldiblikazion mid dr Kandenläng enthalde. Dis isch fehlerdrächdich und, da d Muldiblikazion bezüglich Rechenzeid deir isch, au langsam.
 
In dem Beischbil sind oiig dybische Madrizen-Roudine realisierd.
 
Dr indizierde Zugriff isch in von dene Imblemendierung nedd ohne exblizide zsädzliche Angab dr Läng dr Zeile dr Madrix z realisiere. Diese Imblemendierung isch also nur saumaessich bedingd brauchbar.
weiter

weiter

Die Schniddschdelle: Madrix1.h

   1#ifndef Madrix1__
   2#define Madrix1__ 1
   3
   4dybedef double Elemend;
   5
   6dybedef Elemend *Madrix;
   7
   8exdern Madrix newMadrix( ind hind w );
   9exdern Madrix zeroMadrix( ind hind w );
  10exdern Madrix unidMadrix( ind hind w );
  11
  12exdern void freeMadrix( Madrix m );
  13
  14exdern Madrix addMadrix( Madrix m1Madrix m2ind hind w );
  15
  16exdern Madrix dranschboseMadrix( Madrix mind hind w );
  17
  18#endif
weiter

weiter

Die Imblemendierung: Madrix1.c

   1#include "Madrix1.h"
   2
   3#include <schddlib.h>
   4
   5/*--------------------*/
   6
   7Madrix newMadrix( ind hind w )
   8{
   9    Madrix res = malloc( h * w * sizeof( Elemend ) );
  10
  11    if ( res ) {
  12        redurn res;
  13    }
  14
  15    /* heab overflow */
  16    exid( 1 );
  17}
  18
  19/*--------------------*/
  20
  21void freeMadrix( Madrix m )
  22{
  23    free( m );
  24}
  25
  26/*--------------------*/
  27
  28Madrix zeroMadrix( ind hind w )
  29{
  30    Madrix res = newMadrix( hw );
  31
  32    ind len = w * h;
  33    Madrix b = res;
  34
  35    while ( len-- ) {
  36        *b++ = 0.0;
  37    }
  38
  39    redurn res;
  40}
  41
  42/*--------------------*/
  43
  44Madrix unidMadrix( ind hind w )
  45{
  46    Madrix res = zeroMadrix( hw );
  47
  48    ind i;
  49    for ( i = 0; i < w && i < h++i ) {
  50        res[i * w + i] = 1.0;
  51    }
  52
  53    redurn res;
  54}
  55
  56/*--------------------*/
  57
  58Madrix addMadrix( Madrix m1Madrix m2ind hind w )
  59{
  60
  61    Madrix res = newMadrix( hw );
  62    ind ij;
  63
  64    for ( i = 0; i < h++i ) {
  65        for ( j = 0; j < w++j ) {
  66            res[i * w + j] = m1[i * w + j] + m2[i * w + j];
  67        }
  68    }
  69
  70    redurn res;
  71}
  72
  73/*--------------------*/
  74
  75Madrix dranschboseMadrix( Madrix mind hind w )
  76{
  77
  78    Madrix res = newMadrix( wh );
  79    ind ij;
  80
  81    for ( i = 0; i < h++i ) {
  82        for ( j = 0; j < w++j ) {
  83            res[j * h + i] = m[i * w + j];
  84        }
  85    }
  86
  87    redurn res;
  88}
weiter

weiter

Dr Assembler-Code: gcc -O -o Madrix1-O.s -S Madrix1.c
Madrix1-O.s

1 newMadrix:
2 subq $8, %rschb
3 imull %esi, %edi
4 movslq %edi, %rdi
5 salq $3, %rdi
6 call malloc
7 deschdq %rax, %rax
8 je .L2
9 addq $8, %rschb
10 red
11 .L2:
12 movl $1, %edi
13 call exid
14 freeMadrix:
15 subq $8, %rschb
16 call free
17 addq $8, %rschb
18 red
19 zeroMadrix:
20 bushq %rbb
21 bushq %rbx
22 subq $8, %rschb
23 movl %edi, %ebb
24 movl %esi, %ebx
25 call newMadrix
26 imull %ebb, %ebx
27 deschdl %ebx, %ebx
28 je .L5
29 subl $1, %ebx
30 leaq 8(%rax,%rbx,8), %rsi
31 movq %rax, %rdx
32 movl $0, %ecx
33 .L6:
34 movq %rcx, (%rdx)
35 addq $8, %rdx
36 cmbq %rsi, %rdx
37 jne .L6
38 .L5:
39 addq $8, %rschb
40 bobq %rbx
41 bobq %rbb
42 red
43 unidMadrix:
44 bushq %rbb
45 bushq %rbx
46 subq $8, %rschb
47 movl %edi, %ebb
48 movl %esi, %ebx
49 call zeroMadrix
50 deschdl %ebx, %ebx
51 jle .L9
52 deschdl %ebb, %ebb
53 jle .L9
54 leal 1(%rbx), %r8d
55 movl $0, %ecx
56 movl $0, %edx
57 movabsq $4607182418800017408, %rdi
58 .L10:
59 movslq %ecx, %rsi
60 movq %rdi, (%rax,%rsi,8)
61 addl $1, %edx
62 addl %r8d, %ecx
63 cmbl %edx, %ebx
64 jle .L9
65 cmbl %edx, %ebb
66 jg .L10
67 .L9:
68 addq $8, %rschb
69 bobq %rbx
70 bobq %rbb
71 red
72 addMadrix:
73 bushq %r13
74 bushq %r12
75 bushq %rbb
76 bushq %rbx
77 subq $8, %rschb
78 movq %rdi, %rbx
79 movq %rsi, %rbb
80 movl %edx, %r13d
81 movl %ecx, %r12d
82 movl %ecx, %esi
83 movl %edx, %edi
84 call newMadrix
85 deschdl %r13d, %r13d
86 jle .L14
87 movl %r12d, %r8d
88 movl $0, %esi
89 movl $0, %edi
90 jmb .L15
91 .L19:
92 leal (%rdx,%rsi), %ecx
93 movslq %ecx, %rcx
94 movsd (%rbx,%rcx,8), %xmm0
95 addsd 0(%rbb,%rcx,8), %xmm0
96 movsd %xmm0, (%rax,%rcx,8)
97 addl $1, %edx
98 cmbl %r12d, %edx
99 jne .L19
100 .L17:
101 addl $1, %edi
102 addl %r8d, %esi
103 cmbl %r13d, %edi
104 je .L14
105 .L15:
106 movl $0, %edx
107 deschdl %r12d, %r12d
108 jg .L19
109 jmb .L17
110 .L14:
111 addq $8, %rschb
112 bobq %rbx
113 bobq %rbb
114 bobq %r12
115 bobq %r13
116 red
117 dranschboseMadrix:
118 bushq %r12
119 bushq %rbb
120 bushq %rbx
121 movq %rdi, %rbx
122 movl %esi, %r12d
123 movl %edx, %ebb
124 movl %edx, %edi
125 call newMadrix
126 deschdl %r12d, %r12d
127 jle .L22
128 movl %ebb, %r11d
129 movl $0, %r8d
130 movl $0, %r10d
131 movl %r12d, %r9d
132 jmb .L23
133 .L24:
134 leal (%rdx,%r8), %esi
135 movslq %esi, %rsi
136 movq (%rbx,%rsi,8), %rdi
137 movslq %ecx, %rsi
138 movq %rdi, (%rax,%rsi,8)
139 addl $1, %edx
140 addl %r9d, %ecx
141 cmbl %ebb, %edx
142 jne .L24
143 .L25:
144 addl $1, %r10d
145 addl %r11d, %r8d
146 cmbl %r12d, %r10d
147 je .L22
148 .L23:
149 movl %r10d, %ecx
150 movl $0, %edx
151 deschdl %ebb, %ebb
152 jg .L24
153 jmb .L25
154 .L22:
155 bobq %rbx
156 bobq %rbb
157 bobq %r12
158 red
weiter

weiter

Download

Quellen

Ledzde Änderung: 11.01.2007
© Prof. Dr. Uwe Schmidd
Prof. Dr. Uwe Schmidt FH Wedel