Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
FreePascal / Lazarus
|
Re: Typisierte vs. Untypisierte Konstante
15. Jun 2009, 22:23
Hi,
Code:
(gdb) disassemble
Dump of assembler code for function main:
0x08048080 <main+0>: push %ebp
0x08048081 <main+1>: mov %esp,%ebp
0x08048083 <main+3>: sub $0x210,%esp
0x08048089 <main+9>: mov %ebx,-0x210(%ebp)
0x0804808f <main+15>: mov %esi,-0x20c(%ebp)
0x08048095 <main+21>: mov %edi,-0x208(%ebp)
0x0804809b <main+27>: call 0x8058540 <fpc_initializeunits>
0x080480a0 <main+32>: mov 0x8095278,%eax
0x080480a5 <main+37>: mov %eax,0x80b33b0
0x080480aa <main+42>: mov 0x809527c,%eax
0x080480af <main+47>: mov %eax,0x80b33b4
0x080480b4 <main+52>: call 0x805c430 <fpc_get_output>
0x080480b9 <main+57>: mov %eax,%edi
0x080480bb <main+59>: mov $0x8095284,%ebx
0x080480c0 <main+64>: lea -0x100(%ebp),%eax
0x080480c6 <main+70>: push $0x7
0x080480c8 <main+72>: push $0x1
0x080480ca <main+74>: mov $0x80b33b0,%ecx
0x080480cf <main+79>: mov %eax,%esi
0x080480d1 <main+81>: mov $0xff,%edx
0x080480d6 <main+86>: call 0x804a6f0 <fpc_chararray_to_shortstr>
0x080480db <main+91>: lea -0x100(%ebp),%eax
---Type <return> to continue, or q <return> to quit---
0x080480e1 <main+97>: mov %ebx,%edx
0x080480e3 <main+99>: call 0x804a6b0 <fpc_shortstr_compare_equal>
0x080480e8 <main+104>: test %eax,%eax
0x080480ea <main+106>: sete %cl
0x080480ed <main+109>: mov %edi,%ebx
0x080480ef <main+111>: mov %ebx,%eax
0x080480f1 <main+113>: mov $0x0,%esi
0x080480f6 <main+118>: mov %eax,%edx
0x080480f8 <main+120>: mov %esi,%eax
0x080480fa <main+122>: call 0x805ce40 <fpc_write_text_boolean>
0x080480ff <main+127>: call 0x8058410 <fpc_iocheck>
0x08048104 <main+132>: mov %ebx,%eax
0x08048106 <main+134>: call 0x805c5a0 <fpc_writeln_end>
0x0804810b <main+139>: call 0x8058410 <fpc_iocheck>
0x08048110 <main+144>: call 0x805c430 <fpc_get_output>
0x08048115 <main+149>: mov %eax,%edi
0x08048117 <main+151>: lea -0x100(%ebp),%ebx
0x0804811d <main+157>: push $0x7
0x0804811f <main+159>: push $0x1
0x08048121 <main+161>: mov $0x809528e,%ecx
0x08048126 <main+166>: mov %ebx,%eax
0x08048128 <main+168>: mov $0xff,%edx
0x0804812d <main+173>: call 0x804a6f0 <fpc_chararray_to_shortstr>
---Type <return> to continue, or q <return> to quit---
0x08048132 <main+178>: lea -0x100(%ebp),%ebx
0x08048138 <main+184>: lea -0x200(%ebp),%eax
0x0804813e <main+190>: push $0x7
0x08048140 <main+192>: push $0x1
0x08048142 <main+194>: mov $0x80b33b0,%ecx
0x08048147 <main+199>: mov %eax,%esi
0x08048149 <main+201>: mov $0xff,%edx
0x0804814e <main+206>: call 0x804a6f0 <fpc_chararray_to_shortstr>
0x08048153 <main+211>: lea -0x200(%ebp),%eax
0x08048159 <main+217>: mov %ebx,%edx
0x0804815b <main+219>: call 0x804a6b0 <fpc_shortstr_compare_equal>
0x08048160 <main+224>: test %eax,%eax
0x08048162 <main+226>: sete %cl
0x08048165 <main+229>: mov %edi,%ebx
0x08048167 <main+231>: mov %ebx,%eax
0x08048169 <main+233>: mov $0x0,%esi
0x0804816e <main+238>: mov %eax,%edx
0x08048170 <main+240>: mov %esi,%eax
0x08048172 <main+242>: call 0x805ce40 <fpc_write_text_boolean>
0x08048177 <main+247>: call 0x8058410 <fpc_iocheck>
0x0804817c <main+252>: mov %ebx,%eax
0x0804817e <main+254>: call 0x805c5a0 <fpc_writeln_end>
0x08048183 <main+259>: call 0x8058410 <fpc_iocheck>
---Type <return> to continue, or q <return> to quit---
0x08048188 <main+264>: call 0x8058780 <SYSTEM_DO_EXIT>
0x0804818d <main+269>: mov -0x210(%ebp),%ebx
0x08048193 <main+275>: mov -0x20c(%ebp),%esi
0x08048199 <main+281>: mov -0x208(%ebp),%edi
0x0804819f <main+287>: leave
0x080481a0 <main+288>: ret
End of assembler dump.
Hm... Beim ersten mal wird die Variable nach ShortString konvertiert und die nicht typisierte Konstante wohl als ShortString Konstante behandelt, beim zweiten Mal wird beides nach ShortString konvertiert und dann verglichen. Dann muss die Konstante anders aussehen als das umgewandelte Array? Na Schluss für heute,übermorgen werd ich eventuell mal gucken was bei ner Zuweisung an ShortString herauskommt und da sehen wo das Problem liegt.
@roter Kasten: Das ist von Delphi??? Liefert Delphi denn auch zwei verschiedene Ergebnisse wenn man den Code ausführt?
Gruß
Felix
Felix Alter
|