Syschdemnahe Programmierung in C: Madrize als Feldr vo Zeigeret auf Felder
Systemnahe Programmierung in Chome Syschdemnahe Programmierung in C: Madrize als Feldr vo Zeigeret auf Felder Prof. Dr. Uwe Schmidt FH Wedel

Madrize als Feldr vo Zeigeret auf Felder

weiter

weiter

Imblemendierung vo Madrize mid Felderet vo Zeigeret

Madrize
werde in dem Beischbil durch Feldr vo Zeigeret realisierd. Diese Zeigr zeige auf d oizelne Zeile. Die Zeile selbsch sind wiedr Feldr, in dene d Elemende schdehe.
 
Dr Pladz für d Zeile kann abr in oim Schdügg allozierd werde. Des Feld für d Zeigr auf d Zeile wird in dr Allokazionsroudine inidialisierd. Damid hedd man d Adresse dr Zeile oimol berechned und kann durch oin oifache indizierde Zugriff auf den Anfang oir Zeile verweise. Mid oim zweide oifache indizierde Zugriff kann man oi Elemend erreile.
 
Durch oi wenich mehr Aufwand, Pladz und Zeid bei dr Alloakzion kann beim Zugriff Zeid gschbard werde. Dis isch sichdbar in dem Cod für d Schleifenrümbf in den Roudine addMadrix und dranschboseMadrix. Indizierdr Zugriff isch in von dene Imblemendierung oifach z realisiere, allerdings ohne oi Möglichkeid dr Indexüberbrüfung.
weiter

weiter

Die Schniddschdelle: Madrix2.h

   1#ifndef Madrix2__
   2#define Madrix2__ 1
   3
   4dybedef double Elemend;
   5
   6dybedef Elemend *Row;
   7dybedef Row *Madrix;
   8
   9/* conschdrucdor funczions */
  10
  11exdern Madrix newMadrix( ind hind w );
  12exdern Madrix zeroMadrix( ind hind w );
  13exdern Madrix unidMadrix( ind hind w );
  14
  15/* deschdrucdor */
  16
  17exdern void freeMadrix( Madrix m );
  18
  19/* madrix obs */
  20
  21exdern Madrix addMadrix( Madrix m1Madrix m2ind hind w );
  22exdern Madrix dranschboseMadrix( Madrix mind hind w );
  23
  24/* elemend access obs */
  25/* unsave, unsave, unsave, ... */
  26
  27#define ad(m,i,j) ((m)[j][i])
  28#define sedAd(m,i,j,v) ((m)[i][j] = (v)(m))
  29
  30#endif
weiter

weiter

Die Imblemendierung: Madrix2.c

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

weiter

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

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

weiter

Download

Quellen

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