Hur mycket går det att slakta i denna kod?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

Källa www.jonshobby.se/elforum/Blink-LED_Atmega16U4.zip

Blinking_LED.elf: file format elf32-avr

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000017c 00000000 00000000 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .bss 00000002 00800100 00800100 000001f0 2**0
ALLOC
2 .debug_aranges 00000020 00000000 00000000 000001f0 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 00000057 00000000 00000000 00000210 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_info 0000012c 00000000 00000000 00000267 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000000be 00000000 00000000 00000393 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_line 000001ce 00000000 00000000 00000451 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000040 00000000 00000000 00000620 2**2
CONTENTS, READONLY, DEBUGGING
8 .debug_str 0000013b 00000000 00000000 00000660 2**0
CONTENTS, READONLY, DEBUGGING

Disassembly of section .text:

00000000 <__vectors>:
0: 0c 94 56 00 jmp 0xac ; 0xac <__ctors_end>
4: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
8: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
10: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
14: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
18: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
1c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
20: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
24: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
28: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
2c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
30: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
34: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
38: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
3c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
40: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
44: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
48: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
4c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
50: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
54: 0c 94 a2 00 jmp 0x144 ; 0x144 <__vector_21>
58: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
5c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
60: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
64: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
68: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
6c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
70: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
74: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
78: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
7c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
80: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
84: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
88: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
8c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
90: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
94: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
98: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
9c: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
a0: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
a4: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>
a8: 0c 94 68 00 jmp 0xd0 ; 0xd0 <__bad_interrupt>

000000ac <__ctors_end>:
ac: 11 24 eor r1, r1
ae: 1f be out 0x3f, r1 ; 63
b0: cf ef ldi r28, 0xFF ; 255
b2: d5 e0 ldi r29, 0x05 ; 5
b4: de bf out 0x3e, r29 ; 62
b6: cd bf out 0x3d, r28 ; 61

000000b8 <__do_clear_bss>:
b8: 11 e0 ldi r17, 0x01 ; 1
ba: a0 e0 ldi r26, 0x00 ; 0
bc: b1 e0 ldi r27, 0x01 ; 1
be: 01 c0 rjmp .+2 ; 0xc2 <.do_clear_bss_start>

000000c0 <.do_clear_bss_loop>:
c0: 1d 92 st X+, r1

000000c2 <.do_clear_bss_start>:
c2: a2 30 cpi r26, 0x02 ; 2
c4: b1 07 cpc r27, r17
c6: e1 f7 brne .-8 ; 0xc0 <.do_clear_bss_loop>
c8: 0e 94 91 00 call 0x122 ; 0x122 <main>
cc: 0c 94 bc 00 jmp 0x178 ; 0x178 <_exit>

000000d0 <__bad_interrupt>:
d0: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>

000000d4 <SetupHardware>:
d4: 84 b7 in r24, 0x34 ; 52
d6: 87 7f andi r24, 0xF7 ; 247
d8: 84 bf out 0x34, r24 ; 52
da: 88 e1 ldi r24, 0x18 ; 24
dc: 0f b6 in r0, 0x3f ; 63
de: f8 94 cli
e0: 80 93 60 00 sts 0x0060, r24
e4: 10 92 60 00 sts 0x0060, r1
e8: 0f be out 0x3f, r0 ; 63
ea: 80 e0 ldi r24, 0x00 ; 0
ec: 90 e0 ldi r25, 0x00 ; 0
ee: 20 e8 ldi r18, 0x80 ; 128
f0: 0f b6 in r0, 0x3f ; 63
f2: f8 94 cli
f4: 20 93 61 00 sts 0x0061, r18
f8: 80 93 61 00 sts 0x0061, r24
fc: 0f be out 0x3f, r0 ; 63
fe: 9f ef ldi r25, 0xFF ; 255
100: 94 b9 out 0x04, r25 ; 4
102: 80 ec ldi r24, 0xC0 ; 192
104: 87 b9 out 0x07, r24 ; 7
106: 9a b9 out 0x0a, r25 ; 10
108: 80 e4 ldi r24, 0x40 ; 64
10a: 8d b9 out 0x0d, r24 ; 13
10c: 83 ef ldi r24, 0xF3 ; 243
10e: 80 bb out 0x10, r24 ; 16
110: 92 e0 ldi r25, 0x02 ; 2
112: 94 bd out 0x24, r25 ; 36
114: 85 e0 ldi r24, 0x05 ; 5
116: 85 bd out 0x25, r24 ; 37
118: 8e e4 ldi r24, 0x4E ; 78
11a: 87 bd out 0x27, r24 ; 39
11c: 90 93 6e 00 sts 0x006E, r25
120: 08 95 ret

00000122 <main>:
122: 80 e8 ldi r24, 0x80 ; 128
124: 85 bf out 0x35, r24 ; 53
126: 85 bf out 0x35, r24 ; 53
128: 0e 94 6a 00 call 0xd4 ; 0xd4 <SetupHardware>
12c: 78 94 sei
12e: 90 e4 ldi r25, 0x40 ; 64
130: 80 91 01 01 lds r24, 0x0101
134: 88 23 and r24, r24
136: e1 f3 breq .-8 ; 0x130 <main+0xe>
138: 8e b1 in r24, 0x0e ; 14
13a: 89 27 eor r24, r25
13c: 8e b9 out 0x0e, r24 ; 14
13e: 10 92 01 01 sts 0x0101, r1
142: f6 cf rjmp .-20 ; 0x130 <main+0xe>

00000144 <__vector_21>:
144: 1f 92 push r1
146: 0f 92 push r0
148: 0f b6 in r0, 0x3f ; 63
14a: 0f 92 push r0
14c: 11 24 eor r1, r1
14e: 8f 93 push r24
150: 80 91 00 01 lds r24, 0x0100
154: 8f 5f subi r24, 0xFF ; 255
156: 80 93 00 01 sts 0x0100, r24
15a: 80 91 00 01 lds r24, 0x0100
15e: 84 36 cpi r24, 0x64 ; 100
160: 28 f0 brcs .+10 ; 0x16c <__vector_21+0x28>
162: 10 92 00 01 sts 0x0100, r1
166: 81 e0 ldi r24, 0x01 ; 1
168: 80 93 01 01 sts 0x0101, r24
16c: 8f 91 pop r24
16e: 0f 90 pop r0
170: 0f be out 0x3f, r0 ; 63
172: 0f 90 pop r0
174: 1f 90 pop r1
176: 18 95 reti

00000178 <_exit>:
178: f8 94 cli

0000017a <__stop_program>:
17a: ff cf rjmp .-2 ; 0x17a <__stop_program>

Hur mycket går det att slakta i denna kod?
Jag vill sätta datariktningsregistret. Tända och släcka 0x0e pin x. Inget annat. Ingen fördröjning(jag skriver en egen loop i loop). Quick and dirty.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur mycket går det att slakta i denna kod?

Inlägg av sodjan »

> Jag vill sätta datariktningsregistret. Tända och släcka 0x0e pin x.

Men gör det då. Vad har det att göra med allt det andra skräpet?
Tveksamt om något är road av att läsa en massa dis-assembly listningar.
I ZIP'en du har länkat till har du ju även C-källkoden direkt också.
Varför utgår du inte från *den* istället för assembler listan ?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Hur mycket går det att slakta i denna kod?

Inlägg av v-g »

sodjan:Mer utmaning kanske? ;)
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Re: Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

Finns det inget som måste vara med? Det i början verkar obligatoriskt. Eller är det bara C skräp?

Början till min "Lopop i loop fördröjning."

/ Lopop i loop fördröjning.
ldi r17, 0x00 /nolla ett reg ex. r17 OM DE ÄR LEDIGA
ldi r18, 0x00 /nolla ett reg ex. r18 OM DE ÄR LEDIGA
adress1:
inc r18 /öka r18 med 1
adress2:
inc r17 /öka r17 med 1
/ Här kan man lägga en dummy operation för att slöa ner mer
cpi r17,0x00 /Jämför r17 med 0
brne .-4????? /Hoppa till adress2 om inte lika EJ KLAR!
cpi r18,0x00 /Jämför r18 med 0
brne .-4????? /Hoppa till adress1 om inte lika EJ KLAR!

Vilka register är lämpliga till "user"? Hur räknar man ut hur många steg brne skall hoppa?

C Kan jag för lite om ännu. Assembler gäller än så länge. Nån stans fick jag både C och assembler i samma textfil om vart annat. På det viset kan jag förstå C bättre genom att se assembler översättningen på raden under. Minns inte var. Kan ha varit via AVRstudio 4.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hur mycket går det att slakta i denna kod?

Inlägg av Icecap »

Man kan begära en assembler-källkod från många C-kompilers, då kan man se vad ett C-kommando utlöser av asm-steg.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Re: Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

Koden växer fram.

ldi r24, 0x40 ; $0040=dec 64 DDRE = (1<<PE6)
out 0x0d, r24 ; LED port as output
; Hit skall sista jmp hoppa
in r24, 0x0e ; 14PORTE ^= (1<<PE6);
eor r24, 0x40 ; Toggle r24
out 0x0e, r24 ; Toggle PE6

/ Lopop i loop fördröjning.
ldi r17, 0x00 /nolla ett reg ex. r17 OM DE ÄR LEDIGA
ldi r18, 0x00 /nolla ett reg ex. r18 OM DE ÄR LEDIGA
adress1:
inc r18 /öka r18 med 1
adress2:
inc r17 /öka r17 med 1
/ Här kan man lägga en dummy operation för att slöa ner mer
cpi r17,0x00 /Jämför r17 med 0
brne .-4????? /Hoppa till adress2 om inte lika EJ KLAR!
cpi r18,0x00 /Jämför r18 med 0
brne .-4????? /Hoppa till adress1 om inte lika EJ KLAR!

jmp 00?? /Hoppa till adress där toggle börjar EJ KLAR!


Finns det hopp om att det funkar? Kan man ersätte "out 0x0d, r24" med "ld 0xd0,40"? Och frågar igen Vilka register är lediga? Kan jag ta r1, r2 och r3 istället?
Nerre
Inlägg: 27233
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hur mycket går det att slakta i denna kod?

Inlägg av Nerre »

Vilka register som är lediga bestämmer du själv, det är ju du som skriver programmet...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur mycket går det att slakta i denna kod?

Inlägg av sodjan »

Kod utan code är inte vacker kod.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Re: Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

Med erfarenhet har jag lärt mig att ibland kan vissa saker vara "reserverade". Men jag vågar nog att testa r1,r2 och r3, om resten funkar.
Försöker få AVRStudio 4 att göra hand assemblerings jobbet. Men det vill inte. Har startat ett asm project. Och gjort en build. Bara ett error :bravo: , men sen är det stopp. View/Disassembler och debug är "gråa".
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur mycket går det att slakta i denna kod?

Inlägg av sodjan »

> Bara ett error...

Är det något slags företagshemlighet *vilket* "error" du får?

> Försöker få AVRStudio 4 att göra hand assemblerings jobbet.

Bara en liten detalj, AVRStudio *hand* assemblerar inte.
AVRStudio saknar händer... :-)

> brne .-4????? /Hoppa till adress2 om inte lika EJ KLAR!

Vad är ".-4?????" ?
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Re: Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

Du har så rätt så. "brne .-4" var det som inte AVRStudio 4 gillade. Klippte och klistrade det från Blinking_LED.lss

ldi r17, 0x00
ldi r18, 0x00

inc r18
inc r17

cpi r17,0x00
brne 0003
cpi r18,0x00
brne 0002

Funkar i AVRStudio 4 :D . brne hoppar visst i "word". Nollan räknas nog.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur mycket går det att slakta i denna kod?

Inlägg av sodjan »

Det är generellt sett snyggare med hopp till labels istället för rellativa hopp.
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Re: Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

Labels är för hög nivå för mig ;-) rå assembler gillar jag :lol:

ldi r24, 0x40 ; $40=bin 0010 0000=pin 6 DDRE
out 0x0d, r24 ; $000d=dec 13 LED port as output
ldi r25, 0x40 ; För eor funkar bara mot ett annat register

in r24, $0e ; Läs PE6
eor r24, r25 ; Toggla med R25
out $0e, r24 ; Toggle PE6

;/ Lopop i loop fördröjning.
ldi r17, 0xfe ; nolla ett reg ex. r17
ldi r18, 0xff ; nolla ett reg ex. r18

inc r18 ; öka r18 med 1

inc r17 ; öka r17 med 1
;/ Här kan man lägga en dummy operation för att slöa ner mer
cpi r17,0x00 ; Jämför r17 med 0
brne $0009 ; Hoppa till inc r17 om inte lika
cpi r18,0x00 ;/Jämför r18 med 0
brne $0008 ;/Hoppa till inc r18 om inte lika

Funkar i AVRStudio 4. Skall prova i "simple-usb", som jag köpte av
thepirateboy här på forumet. Med ATmega16u4. Kommer det blinka sakta eller inte synas...?
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hur mycket går det att slakta i denna kod?

Inlägg av Icecap »

"Rå assembler" är den rätta väg att gå när man vill att inget ska fungera...

Jag har i sin tid gjort en disassembler till Z80, att göra den var enkelt men väldigt snabbt lärde jag mig att labels är det enda rätta för karlar med hår på magen! Jag modifierade den till att ta med labels och det fungerade extremt mycket bättre, faktisk så bra att jag kunde disassemblera den BASIC som fanns på en TRS80. Jag fick ändra ett par småsaker som sannolikt var som en fingerprint i koden men efter det (och innan också förvisso) kunde jag assemblera skiten och det fungerade!

Sedan kunde jag lägga till saker och ändra kommandon, allt utan att det sket sig och det var enbart tack vara att jag använde labels.

Kör man utan labels är det för att man inte vill programmera men debugga istället, själv tycker jag att det är roligare att åstadkomma något...
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: Hur mycket går det att slakta i denna kod?

Inlägg av labmaster »

:humm: Det är sådana här trådar som får mig nyfiken på vad det är för människa bakom nicken .

Varför i hela friden öppnar du inte databladet och läser hur du skall konfigurera porten och sedan sätta bitarna till önskat värde på porten?

Och C lär man sig inte genom att titta på vilken maskinkod/assemblerkod kompilatorn generar. Då får du hålla på till Sankte Per kallar på dig.
Skriv svar