 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eukalyptus
Anmeldungsdatum: 17.05.2013 Beiträge: 11
|
Verfasst am: 17.05.2013, 11:43 Titel: Bug? 0.23 vs 0.24 |
|
|
Hallo liebe FB-Gemeinde!
Dies ist mein erster Post - und gleich ein Bug
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 |
|
 |
dkl FreeBASIC-Compiler-Entwickler
Anmeldungsdatum: 25.04.2010 Beiträge: 14 Wohnort: Germany
|
Verfasst am: 17.05.2013, 19:04 Titel: |
|
|
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 |
|
 |
Eukalyptus
Anmeldungsdatum: 17.05.2013 Beiträge: 11
|
Verfasst am: 18.05.2013, 06:30 Titel: |
|
|
Danke!
Bin neugierig, was da rauskommt.
E |
|
Nach oben |
|
 |
dkl FreeBASIC-Compiler-Entwickler
Anmeldungsdatum: 25.04.2010 Beiträge: 14 Wohnort: Germany
|
Verfasst am: 18.05.2013, 17:31 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 18.05.2013, 18:22 Titel: |
|
|
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 |
|
 |
Eukalyptus
Anmeldungsdatum: 17.05.2013 Beiträge: 11
|
Verfasst am: 20.05.2013, 23:06 Titel: |
|
|
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 )
Vielen Dank an euch!
E |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.05.2013, 10:07 Titel: |
|
|
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  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|
|
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.
|
|