Angenommen, wir haben den folgenden C-Code für ein avr-8bit:
int v1=1;
int v2=2;
v2=v2+v1;
Ich habe folgendes Zerlegen erwartet
ldi r18, 1;
ldi r19, 2;
add r19, r18;
aber nachdem ich gelaufen bin:
avr-gcc -mmcu=atmega2560 Test.c -o Test.elf
und
avr-objdump -S Test.elf > Test.lss
Ich habe das folgende zerlegen
ldi r24, 0x01 ; 1
ldi r25, 0x00 ; 0
std Y+2, r25 ; 0x02
std Y+1, r24 ; 0x01
ldi r24, 0x02 ; 2
ldi r25, 0x00 ; 0
std Y+4, r25 ; 0x04
std Y+3, r24 ; 0x03
ldd r18, Y+3 ; 0x03
ldd r19, Y+4 ; 0x04
ldd r24, Y+1 ; 0x01
ldd r25, Y+2 ; 0x02
add r24, r18
adc r25, r19
std Y+4, r25 ; 0x04
std Y+3, r24 ; 0x03
Gibt es jemanden, der mir helfen kann, das Ergebnis des Disassemblers zu verstehen?
Edit: Mit char wird die Assembly:
ldi r24, 0x01
std Y+1, r24
ldi r24, 0x02
std Y+2, r24
ldd r25, Y+2
ldd r24, Y+1
add r24, r25
std Y+2, r24
Wann gibt es std Unterricht?
-O3
kann kaputten Code erzeugen? [Zitieren erforderlich] (und nein, C-Code, der Undefined Behaviour aufruft und dann mit einigen Optimierungseinstellungen bricht, zählt nicht)Wenn ich einen Beispielcode gefunden habe, werde ich meinen Kommentar beantworten - andere haben das Problem bereits erklärt.
Viele eingebettete Codes, mit denen ich arbeite, definieren zusätzliche Typen, die für ihre Größe spezifisch sind, wie z. B. "uint8, uint16, uint32" für nicht signierte Ints. Auf diese Weise wissen Sie immer genau, mit welcher Art von Variable Sie es zu tun haben. Vor allem in kleinen eingebetteten, signierten, float, "int" von undefinierter Größe / Signiertheit werden Sie alle CPU-Zyklen am besten kosten und im schlimmsten Fall ernsthafte Fehler verursachen.
Hier ist unser aktuelles #defines:
quelle
Ihr C-Code verwendet 16-Bit-Ganzzahlvariablen (int). Der Compiler kann Ihre Gedanken nicht lesen und kompiliert genau das, was in der Quelldatei enthalten ist. Wenn Sie also 8-Bit-Variablen möchten, müssen Sie den entsprechenden Typ verwenden.
Als Ergebnis erhalten Sie immer noch die Werte im Speicher (obwohl einfacher). Ich bin nicht so gut in C, aber meiner Meinung nach gibt es einige Optionen, um die Variable einem Register zuzuweisen, wenn Sie möchten, dass sich einige Variablen in den Registern statt im RAM befinden. Etwas wie:
Beachten Sie, dass für solche Tricks nicht alle Register verfügbar sind.
Also das Fazit? Schreiben Sie Ihre Programme in Assembler. Sie werden immer kleiner, schneller und einfacher zum Lesen / Unterstützen.
quelle