Forum: Compiler & IDEs seltsamer code assembler code.


von mitleser (Gast)


Lesenswert?

Hallo zusammen

Ich arbeite z.Zt. mit einem AtMega664P unter AVR Studio 4.18.
Optimierungsstufe -Os

Es geht um folgenden code. Eingedampft auf das nötigste, aber 
compilierbar und lauffähig.
1
#define    F_CPU     20000000UL
2
3
#include  <inttypes.h>
4
#include  <avr/io.h>
5
#include   <stdlib.h> 
6
7
#define FTDI_TXE        (PINA &   0b00010000)
8
#define FTDI_WR_1       PORTA |=  0b01000000
9
#define FTDI_WR_TOGGLE  PINA  =   0b01000000
10
#define FPGA_DATA_AV    (PINA &   0b00000100)
11
12
//******************************************************
13
//    function prototypes
14
//******************************************************
15
16
int16_t    main(void);
17
18
//******************************************************
19
//  main
20
//******************************************************
21
  
22
int16_t main(void)
23
{
24
  uint16_t    u16_C1, u16_C2;
25
26
  DDRA = 0b11100000;            // IN=0; OUT=1
27
  FTDI_WR_1;
28
29
  for(u16_C1 = 0; u16_C1 < 43; u16_C1++)
30
  {
31
    u16_C2 = 39;
32
    do
33
    {
34
      while(FPGA_DATA_AV != 0);  // Warten bis Daten vom FPGA kommen
35
36
      while(FTDI_TXE != 0);    // Warten bis USB-Bus frei ist
37
38
      FTDI_WR_TOGGLE;        // FTDI_WR_0
39
      FTDI_WR_TOGGLE;        // FTDI_WR_1
40
41
    }while(--u16_C2 != 0);
42
  }
43
44
  return 0;
45
}


Nach dem compilieren zeigt das Disaembler Window folgendes:
(nur ein Ausschnitt)

1
40:       {
2
+0000004A:   EE80        LDI       R24,0xE0       Load immediate
3
+0000004B:   B981        OUT       0x01,R24       Out to I/O location
4
45:         FTDI_WR_1; 
5
+0000004C:   9A16        SBI       0x02,6         Set bit in I/O register
6
+0000004D:   E020        LDI       R18,0x00       Load immediate
7
+0000004E:   E030        LDI       R19,0x00       Load immediate
8
59:             FTDI_WR_TOGGLE;        // FTDI_WR_0  <---- ????????????
9
+0000004F:   E440        LDI       R20,0x40       Load immediate
10
45:         FTDI_WR_1;
11
+00000050:   E287        LDI       R24,0x27       Load immediate
12
+00000051:   E090        LDI       R25,0x00       Load immediate
13
55:             while(FPGA_DATA_AV != 0);  // Warten bis Daten vom FPGA kommen
14
+00000052:   9902        SBIC      0x00,2         Skip if bit in I/O register cleared
15
+00000053:   CFFE        RJMP      PC-0x0001      Relative jump
16
57:             while(FTDI_TXE != 0);    // Warten bis USB-Bus frei ist
17
+00000054:   9904        SBIC      0x00,4         Skip if bit in I/O register cleared
18
+00000055:   CFFE        RJMP      PC-0x0001      Relative jump
19
59:             FTDI_WR_TOGGLE;        // FTDI_WR_0
20
+00000056:   B940        OUT       0x00,R20       Out to I/O location
21
60:             FTDI_WR_TOGGLE;        // FTDI_WR_1
22
+00000057:   B940        OUT       0x00,R20       Out to I/O location
23
63:           }while(--u16_C2 != 0);
24
+00000058:   9701        SBIW      R24,0x01       Subtract immediate from word
25
+00000059:   F7C1        BRNE      PC-0x07        Branch if not equal
26
47:         for(u16_C1 = 0; u16_C1 < 43; u16_C1++)
27
+0000005A:   5F2F        SUBI      R18,0xFF       Subtract immediate
28
+0000005B:   4F3F        SBCI      R19,0xFF       Subtract immediate with carry
29
+0000005C:   322B        CPI       R18,0x2B       Compare with immediate
30
+0000005D:   0531        CPC       R19,R1         Compare with carry
31
+0000005E:   F789        BRNE      PC-0x0E        Branch if not equal
32
67:       }

Was ich gar nicht verstehe, ist der C Kommentar über Adresse 4F:
FTDI_WR_TOGGLE;        // FTDI_WR_0

Warum steht er da? Der passt doch gar nicht zur Anweisung?

Dieses Verhalten ist reproduzierbar!

von 900ss (900ss)


Lesenswert?

Wenn du den Code mit irgendeiner Optimierung übersetzt, dann optimiert 
der Compiler die Anweisungen. Dadurch passen die dann nicht mehr zu den 
'C'-Zeilennummern.
Schalte die Optimierung ab, dann sollte es passen.

von mitleser (Gast)


Lesenswert?

>Dadurch passen die dann nicht mehr zu den
>'C'-Zeilennummern.

Ja, das ist mir klar.
Ich will aber wissen, warum an dieser Stelle ein komplett falscher 
C-Kommentar steht, der nichts mit der folgenden Anweisung zu tun hat.

P.S.
Das Prg wird übrigends korrekt auisgeführt.

von Justus S. (jussa)


Lesenswert?

da wird R20 einfach mit dem Bitmuster 0100 0000, welches FTDI_WR_TOGGLE 
belegt, vorbelegt, und später dann einfach benutzt...siehst du ja 
später, da wird bei jedem Aufruf von FTDI_WR_TOGGLE R20 benutzt

von mitleser (Gast)


Lesenswert?

Bingo :-)

Danke Justus. So einfach ist das ...

von 900ss (900ss)


Lesenswert?

mitleser schrieb:
> Ja, das ist mir klar.

Ist es scheinbar nicht. Sonst würdest du nicht fragen.
Du kannst nicht mehr davon ausgehen, dass die 'C'-Zeilen zu dem 
Assembler passen. Darum(!) steht dort eine 'C'-Zeile, die dort evtl. 
nicht paßt. Übersetze mal mit -O2, dann sieht es wahrscheinlich 
nochmerkwürdiger aus.

von 900ss (900ss)


Lesenswert?

Justus Skorps schrieb:
> da wird R20 einfach mit dem Bitmuster 0100 0000, welches FTDI_WR_TOGGLE
> belegt, vorbelegt, und später dann einfach benutzt...siehst du ja
> später, da wird bei jedem Aufruf von FTDI_WR_TOGGLE R20 benutzt

Das ist reiner Zufall, dass das in dem Zusammnhang paßt. Bei anderen 
Optimierungsstufen stehen dann 'C'-Zeilen scheinbar zu völlig 
unpassendem Assemblercode im Listing.

Andere Optimierungsstufe und schon sieht es anders und vielleicht 
garnicht mehr passend aus.

von mitleser (Gast)


Lesenswert?

>Das ist reiner Zufall, dass das in dem Zusammnhang paßt. Bei anderen

Was ist denn noch?
Die Sache ist doch geklärt. Der Kommentar passt entgegen meiner ersten 
Annahme doch zum Assembler-code, ich habs nur nicht gesehen.
Das hat nix mit Zufall zu tun.

von 900ss (900ss)


Lesenswert?

mitleser schrieb:
> Was ist denn noch?

Das hier ist geklärt und sieht hier "einigermaßen" gut aus. Aber ich 
weiß halt, dass das auch so aussehen kann, dass die C-Sourcezeilen im 
Assemblerlisting an eine ganz unpassenden Stelle stehen können. Will nur 
den Hinweis geben, nur weil es hier einigermaßen paßt, muß das nicht 
immer so sein.
Ich habe gerade kein Beispiel zur Hand, sonst würde ich es zeigen.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

900ss D. schrieb:
> Ich habe gerade kein Beispiel zur Hand, sonst würde ich es zeigen.

Gerade switch/case-Strukturen sehen im Assembler- bzw. Maschinencode oft 
komplett anders aus, da sie gerade bei einer großen Zahl von 
case-Anweisungen nicht als lineare Liste von Abfragen übersetzt werden, 
sondern zunächst als Binärbaum sortiert.

Deutliche Verschiebungen von Zeilennummern findet man insbesondere dann, 
wenn die Quelltexte keine einheitlichen Zeilenenden haben, d.h. eine 
Mischung aus CR, LF, CR/LF vorliegt. Viele Compiler orientieren sich am 
Umbruch der ersten Quelltextzeile.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.