Socke hat geschrieben:Soweit ich das gesehen habe, müsste mein Code von Oben das umsetzen.
Besser, aber nicht optimal. Naja, wenn man optimal will muss man wahrscheinlich alles in ASM machen.
Code: Alles auswählen
procedure copy_pgm_string(psrc, pto : pchar);
label
loop;
begin
asm
mov r26, r22
mov r27, r23
mov r30, r24
mov r31, r25
lpm r0, Z+
st X+, r0
mov r16, r0
loop:
lpm r0, Z+
st X+, r0
dec r16
brne loop
end['r0','r16','r26','r27','r30','r31'];
end;
kompiliert zu:
Code: Alles auswählen
GH_INIT_ss_COPY_PGM_STRINGsPCHARsPCHAR:
push r29
push r28
push r16
in r28,61
in r29,62
subi r28,6
sbci r29,0
in r0,63
cli
out 62,r29
out 63,r0
out 61,r28
std Y+2,r24
std Y+3,r25
std Y+4,r22
std Y+5,r23
# CPU AVR5
mov r26,r22
mov r27,r23
mov r30,r24
mov r31,r25
lpm r0,z+
st x+,r0
mov r16,r0
.Lj9:
lpm r0,z+
st x+,r0
dec r16
brne .Lj9
# CPU AVR5
subi r28,-6
sbci r29,-1
in r0,63
cli
out 62,r29
out 63,r0
out 61,r28
pop r16
pop r28
pop r29
ret
Und Dein Code:
Code: Alles auswählen
procedure copy2_pgm_string(psrc, pto : pchar);
label
loop;
type
// Struktur zum Zugriff auf die einzelnene Bytes
TUInt16Struct = packed record
l: uint8;
h: uint8;
end;
var
// es kann kein direkter Zugriff auf die Record-Elemente erfolgen
// daher muss jedes Byte einen separaten Namen erhalten
s: TUInt16Struct absolute psrc;
lsrc: Uint8 absolute s.l;
hsrc: Uint8 absolute s.h;
t: TUInt16Struct absolute pto;
lto: Uint8 absolute t.l;
hto: Uint8 absolute t.h;
begin
asm
ldd r30, lsrc
ldd r31, hsrc
ldd r26, lto
ldd r27, hto
lpm r0, Z+
st X+, r0
mov r16, r0
loop:
lpm r0, Z+
st X+, r0
dec r16
brne loop
end['r0','r16','r26','r27','r30','r31'];
end;
kompiliert zu:
Code: Alles auswählen
GH_INIT_ss_COPY2_PGM_STRINGsPCHARsPCHAR:
push r29
push r28
push r16
in r28,61
in r29,62
subi r28,6
sbci r29,0
in r0,63
cli
out 62,r29
out 63,r0
out 61,r28
std Y+2,r24
std Y+3,r25
std Y+4,r22
std Y+5,r23
# CPU AVR5
ldd r30,Y+2
ldd r31,Y+2
ldd r26,Y+4
ldd r27,Y+4
lpm r0,z+
st x+,r0
mov r16,r0
.Lj12:
lpm r0,z+
st x+,r0
dec r16
brne .Lj12
# CPU AVR5
subi r28,-6
sbci r29,-1
in r0,63
cli
out 62,r29
out 63,r0
out 61,r28
pop r16
pop r28
pop r29
ret
Mit den paar unnötigen st, ld muss man wohl leben.