Autor Beitrag
FrEaKY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 235


D7
BeitragVerfasst: 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...

ausblenden 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 :P


EDIT!!!:


ich hab es jetzt so:
ausblenden 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 :autsch:

MfG
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 235


D7
BeitragVerfasst: Di 28.10.08 02:06 
@BenBE: DANKE! jetz gehts :)

hab es nun so gemacht:

ausblenden 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 :D !

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 235


D7
BeitragVerfasst: 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:

ausblenden 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)=nilthen
  //      ShowMessage(pstr_1^);
end;


achja und weiter oben hab ich natürlich die funktion aus der dll geladen, weil es sie noch net gab.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.