Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bug? 0.23 vs 0.24

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eukalyptus



Anmeldungsdatum: 17.05.2013
Beiträge: 11

BeitragVerfasst am: 17.05.2013, 11:43    Titel: Bug? 0.23 vs 0.24 Antworten mit Zitat

Hallo liebe FB-Gemeinde!

Dies ist mein erster Post - und gleich ein Bug zwinkern
Ich hab bereits im Forum nach diesem (möglichen) Bug gesucht, aber nichts gefunden.

Dieses kurze Programm hab ich mit den Versionen 0.23 u 0.24 kompiliert:

Code:
Dim As UInteger aData(0 To 2), iPtr
aData(0) = &h11111111
aData(1) = &h11111111
aData(2) = &h11111111

iPtr = @aData(0)

Asm
   mov edi, [iPtr]
   mov eax, &h22222222
   mov dword [edi], eax
End Asm

Print Hex(aData(0))
Print Hex(aData(1))
Print Hex(aData(2))   
Sleep


Ergebnis mit 0.23:
Code:
22222222
11111111
11111111


Ergebnis mit 0.24:
Code:
11111111
22222222
11111111


Der ASM-Code, den ich via Compilerswitch "-R" erhalte, ist in beiden Fällen gleich.
Aber wenn ich die EXEn disassembliere, gibt es einen Unterschied:
(via IDA Pro Free ca. Zeile 410)

0.23:
Code:
lea   eax, [ebp+var_10]
mov   [ebp+var_34], eax
mov   edi, [ebp+var_34]
mov   eax, 22222222h
mov   [edi], eax


0.24:
Code:
lea   eax, [ebp+var_10]
mov   [ebp+var_34], eax
mov   edi, [ebp+var_34]
mov   eax, 22222222h
mov   [edi+4], eax


GCC scheint hier ein "+4" einzufügen!

Allerdings ist das Ergebnis auch mit FB 0.24 in Ordnung, wenn man "dword ptr" statt "dword" im Inline-ASM schreibt...

Da der ASM-Code von FB in beiden Versionen gleich ist, kann das Problem nur mehr bei GCC liegen.


Ist dies nun ein Bug?
Wieso gibt es einen Unterschied zwischen "dword" und "dword ptr"?
Ist dieses "Problem" bekannt?

Vielen Dank
E
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dkl
FreeBASIC-Compiler-Entwickler


Anmeldungsdatum: 25.04.2010
Beiträge: 14
Wohnort: Germany

BeitragVerfasst am: 17.05.2013, 19:04    Titel: Antworten mit Zitat

Das ist schon komisch, mal versuchsweise hab ich diese beiden asm Zeilen als test.asm mit dem GAS (GNU Assembler) kompiliert:

Code:
.intel_syntax noprefix
.section .text
mov dword [edi], eax
mov dword ptr [edi], eax


Und dann per "objdump -d" den code in der .o Datei angeguckt:

Code:
mov    %eax,0x4(%edi)
mov    %eax,(%edi)


Siehe da, GAS erstellt unterschiedlichen code je nach dem ob man DWORD oder DWORD PTR benutzt. Bei DWORD ist ein extra +4 offset dabei, bei DWORD PTR nicht.

Ich hab mal im ##asm IRC channel auf FreeNode gefragt, da wurde mir gesagt dass beides dasselbe sein sollte, wobei das aber bei jedem assembler anders ist. Ich kenn mich auch nicht so gut mit x86 asm aus, aber mir kommt es doch wie ein GAS bug vor.

Dazu kommt dass frühere GAS Versionen (z.B. die as.exe 2.15 von FreeBASIC 0.23) noch für beide Statements den gleichen Code generieren. FreeBASIC 0.24 kommt ja mit einer neueren as.exe, wo anscheinend dieser bug existiert.

Ich denke ich werde das mal bei GNU binutils als bug melden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eukalyptus



Anmeldungsdatum: 17.05.2013
Beiträge: 11

BeitragVerfasst am: 18.05.2013, 06:30    Titel: Antworten mit Zitat

Danke!

Bin neugierig, was da rauskommt.

E
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dkl
FreeBASIC-Compiler-Entwickler


Anmeldungsdatum: 25.04.2010
Beiträge: 14
Wohnort: Germany

BeitragVerfasst am: 18.05.2013, 17:31    Titel: Antworten mit Zitat

Laut diesem binutils bug:

http://sourceware.org/bugzilla/show_bug.cgi?id=11731

ist das ganze beabsichtigt. Dabei werde ichs dann wohl belassen.

Code:
dword [eax]
=
[dword+eax]
=
[eax+4]


Scheint so als ob das erst durch den PTR operator anders wird.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 18.05.2013, 18:22    Titel: Antworten mit Zitat

oder dword nicht verwenden, da dies durch angabe des 32Bit Register eax nicht nötig ist.
Code:
Dim As UInteger aData(0 To 2)
aData(0) = &h11111111
aData(1) = &h11111111
aData(2) = &h11111111

Asm
  lea edi, [aData]
  mov eax, &h22222222
  mov [edi], eax
End Asm

Print Hex(aData(0))
Print Hex(aData(1))
Print Hex(aData(2))
Sleep

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eukalyptus



Anmeldungsdatum: 17.05.2013
Beiträge: 11

BeitragVerfasst am: 20.05.2013, 23:06    Titel: Antworten mit Zitat

Wenn man weiß, worauf man achten muss, dann stellt es ja kein Problem dar.

(Allerdings hab ich immer noch nicht ganz verstanden, weshalb das nun beabsichtigt ist mit den Augen rollen )


Vielen Dank an euch!
E
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 21.05.2013, 10:07    Titel: Antworten mit Zitat

vermutlich wirkt das wie sizeof(dword) = 4
Code:
Dim As UInteger aData(0 To 2)
aData(0) = &h11111111
aData(1) = &h11111111
aData(2) = &h11111111

Asm
  lea edi, [aData]
  mov eax, &h22222222
  mov [edi], eax
  mov dword[edi], eax '[edi+4]
  mov qword[edi], eax '[edi+8]
End Asm

Print Hex(aData(0))
Print Hex(aData(1))
Print Hex(aData(2))
Sleep
ist aber nur eine begründete Vermutung zwinkern
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz