Autor |
Beitrag |
FrEaKY
      
Beiträge: 235
D7
|
Verfasst: Mo 27.10.08 23:49
hi!
ich versuche gerade zwei einfache strings in asm zu einem zusammenzufügen.
aber irgendwie bekomme ich es nicht hin...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| .data msgCaption db "Add two Strings",0 Texta db "String eins ",0 Textb db "String zwei",0 Textc db " ",0 .code
start: ; mov eax, offset mTextc lea eax, Texta lea ebx, Textb add eax, ebx mov offset Textc, eax |
naja bei der letzten zeile, mov offset Textc, eax bekomm ich einen Fehler:
Zitat: |
error A2001: immediate operand not allowed |
hmm...
ps: bitte nicht direkt auf mir rumhacken, mache erst seit gerstern assembler
EDIT!!!:
ich hab es jetzt so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| lea eax, Texta lea ebx, Textb add eax, ebx lea ebx, offset Textc mov ebx, eax invoke MessageBox, NULL, ebx, addr msgCaption, MB_OK |
jetzt kommt zwar kein Fehler mehr, aber das Programm schmiert ab
MfG
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 28.10.08 00:25
Zuerst mal ein allgemeiner Hinweis: Merk Dir für die Nutzung von Registern die Reihenfolge EAX, EDX, ECX. EBX sollte IMMER tabu sein. EDI und ESI nur nutzen, wenn nötig, EBX erst ganz am Ende, wenn es wirklich nicht aders geht; Nicht vergessen, alles außer EAX, EDX und ECX immer auf dem Stack zu sichern.
k, zu deinem Problem: Wenn Du ein LEA ausführst, hast Du nicht den String an sich im Register, sondern einen Pointer auf dessen Anfang. Um Strings also aneinander zu hängen, musst Du zuerst deren Gesamtlänge ermitteln und danach den nötigen Speicher alloziieren. Am Ende musst Du beide Strings in diesen neuen Speicherbereich umkopieren. Schau Dir dazu einmal die Funktion System.@LStrCat (Delphi-Strings) an.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
FrEaKY 
      
Beiträge: 235
D7
|
Verfasst: Di 28.10.08 02:06
@BenBE: DANKE! jetz gehts
hab es nun so gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| .data TextA db "String eins ",0 TextB db "String zwei",0 .code
start: lea eax, offset TextA lea edx, offset TextB invoke lstrcat, eax, edx invoke MessageBox, NULL, eax, addr msgCaption, MB_OK |
heraus kommt "String eins String zwei" so wies sein soll  !
allerdings hab ich jetzt noch ne frage, muss man dafür jetzt unbedingt immer die Api benutzen, oder geht das auch auf die "herkömmliche art"
MfG
|
|
FrEaKY 
      
Beiträge: 235
D7
|
Verfasst: Di 28.10.08 03:23
ok, ich hätte da noch eine andere frage.
ich wollte mir vor diese funktion lstrcat eigentlich zuerst in delphi angucken... doch da bin ich auf 2 überraschungen gestoßen:
1.delphi kannte die funktion nichtmal?!? was mich jetzt gewundert hat, aber ist nicht weiter schlimm.. habe mir die einfach aus der kernel32 geholt.
2. ich bekomme bei der funktion eine zugriffsverletzung.
soweit bin ich bis jetzt gekommen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); var str_1, str_2 : string; pstr_1, pstr_2 : ^string; begin str_1 := 'StringNumber1' +#0; pstr_1 := @str_1; str_2 := 'StringNumber2' +#0; pstr_2 := @str_2; if not (lstrcat(@pstr_1, @pstr_2)=nil) then end; |
achja und weiter oben hab ich natürlich die funktion aus der dll geladen, weil es sie noch net gab.
Delphi-Quelltext 1: 2: 3: 4: 5:
| function lstrcat(lpString1:LPTSTR; lpString2:LPTSTR): LPTSTR; stdcall; [...] implementation [...] function lstrcat; external kernel32 name 'lstrcat'; |
wo lauert der fehler?
// sry das ich das jetzt hier in den thread geposted hab aber es hat ja eng mit dem thema zu tun
MfG
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 28.10.08 12:15
Die Man Beachte die Schreibweise *G* Hab nicht um sonst System.@LStrCat geschrieben, d.h. das ist eine Funktion der CompilerMagic von Delphi. Die findest Du in der System.pas unter _LSTRCat (und ggf. noch paar anhängsel, bin da aber grad nicht sicher).
Ferner der Hinweis zu den Strings: Es gibt einen Unterschied zwischen AnsiStrings ("Delphi-String") und PChar. Was Du oben in deinem ASM-Stückchen benutzt hast, sind PChars, LStrCat nutzt LongStrings. Bei diesen handelt es sichum Zeiger auf das erste Byte des Textes, zusätzlich steht aber vor dem String noch seine Länge.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|