Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#8

Re: Alternative zu StrpCopy gesucht

  Alt 9. Aug 2005, 21:59
Um die Frage von Peter noch schnell zu beantworten, habe ich seinen Code mal in leicht abgeänderter Form:
Code:
begin
   [color=green]szStr        := 'Hallo';[/color]
   [color=red]TArrayOfChar(ArrayOfChar) := PArrayOfChar(Pointer(szStr))^;[/color]
   [color=blue]MessageBox(0, ArrayOfChar, ArrayOfChar, 0);[/color]
end.
...ausgetestet und disassembliert und danach kommentiert. Sollte also auch für Assemblerunkundige verständlich sein.
Code:
[color=gray]CODE:004038D4 start:
CODE:004038D4                 push   ebp
CODE:004038D5                 mov    ebp, esp
CODE:004038D7                 add    esp, 0FFFFFFF4h
CODE:004038DA                push   esi
CODE:004038DB                push   edi
CODE:004038DC                mov    eax, offset dword_4038AC
CODE:004038E1                 call   @Sysinit@@InitExe$qqrv ; Sysinit::__linkproc__ InitExe(void)
CODE:004038E6                 xor    eax, eax
CODE:004038E8                 push   ebp
CODE:004038E9                 push   offset ExceptionHandler
CODE:004038EE                push   dword ptr fs:[eax]
CODE:004038F1                 mov    fs:[eax], esp[/color]
; ------------------------------------------------------------------------
[color=#80FF80][b]; Hier wird in den Registern (Aufrufkonv. "register") der literale und der
; Zielstring übergeben![/b][/color]
[color=green]CODE:004038F4                 mov    eax, offset szStr ; Destination
CODE:004038F9                 mov    edx, offset aHallo ; Source (literal string)
CODE:004038FE                call   @System@@LStrAsg$qqrv ; System::__linkproc__ LStrAsg(void)[/color]
; ------------------------------------------------------------------------
[color=#FF8080][b]; Diese 2 Zeilen könnte man in eine stecken, aber das soll mal egal sein,
; wichtig ist, daß hier der Pointer auf den Puffer des Strings in
; ESI (Quellpointer-Register) geladen wird[/b][/color]
[color=red]CODE:00403903                 mov    eax, ds:szStr
CODE:00403908                 mov    esi, eax       ; Init ESI[/color]
[color=#FF8080][b]; Hier wird das Offset auf den Puffer - ArrayOfChar - in EDI (Zielpointer-Register)
; geladen.[/b][/color]
[color=red]CODE:0040390A                mov    edi, offset ArrayOfChar ; Init EDI[/color]
[color=#FF8080][b]; Anzahl der auszuführenden Wiederholungen[/b][/color]
[color=red]CODE:0040390F                mov    ecx, 6[/color]
[color=#FF8080][b]; Wiederhole ECX-mal das Kopieren von jeweils einem DWORD von ESI
; nach EDI[/b][/color]
[color=red]CODE:00403914                 rep movsd              ; Copy 6 DWORDs from
CODE:00403914                                         ; ESI to EDI[/color]
[color=#FF8080][b]; Kopiere 2 weitere Bytes ...[/b][/color]
[color=red]CODE:00403916                 movsw                  ; Copy 2 more bytes[/color]
; ------------------------------------------------------------------------
[color=#8080FF][b]; "Umgekehrte" Übergabe der Parameter auf den Stack und Aufruf von MessageBox()[/b][/color]
[color=blue]CODE:00403918                 push   0
CODE:0040391A                push   offset ArrayOfChar
CODE:0040391F                push   offset ArrayOfChar
CODE:00403924                 push   0
CODE:00403926                 call   MessageBoxA_0[/color]
[color=gray]CODE:0040392B                xor    eax, eax
CODE:0040392D                pop    edx
CODE:0040392E                pop    ecx
CODE:0040392F                pop    ecx
CODE:00403930                 mov    fs:[eax], edx
CODE:00403933                 push   offset loc_403940
CODE:00403938
CODE:00403938 locret_403938:                         ; CODE XREF: CODE:0040393Ej
CODE:00403938                 retn[/color]
Ich habe den Code ausführlichst kommentiert. Einfach mal reinschauen.

Fazit: Es spricht nichts dagegen. Offenbar ermöglicht der Compiler eine Zuweisung eines Zeichenarrays an ein anderes Zeichenarray indem dies transparent in einen Kopiervorgang (zudem einen effektiven - weil ohne zusätzlichen Aufruf) übersetzt wird.

Es spricht also nichts dagegen
  Mit Zitat antworten Zitat