# NASM dynamisch Speicher reservieren



## Schnacki (22. Dezember 2007)

Hallo, ich habe mal eine Frage:

Ich versuche dynamisch einen String zu speichern und ihn dann ausdrucken, nur leider schreibt er nichts:


```
section .text
global _start
_start:

%define	LIMIT	4			; about 100Megs
mov eax, 45
mov	ebx,0				; get bottom of data segment
int 80h
add	eax,LIMIT			; allocate +LIMIT memory
mov	ebx,eax
mov eax, 45
int 80h

mov eax, "TEST"
mov esi, eax

mov eax, 4
mov ebx, 1
mov ecx, esi
mov edx,4
int 80h

mov eax,1
xor ebx,ebx
int 80h
```
Wisst ihr woran das liegen kann?


----------



## Matthias Reitinger (22. Dezember 2007)

Hallo,

in Zeile 14 schreibst du den Wert von "TEST" in das Register eax. Eigentlich willst du den Wert aber in den Speicher schreiben an die Adresse, die in eax steht. Das geht folgendermaßen:

```
mov dword [eax], "TEST"
```
Funktioniert aber auch nur, weil "TEST" zufälligerweise aus 4 Bytes (entspricht einem dword) besteht.

Für Strings beliebiger Länge würde man es etwa so machen:

```
mov esi, msg
mov edi, eax
mov ecx, len
rep movsb
```
Und im Datenbereich:

```
section .data
msg db 'Hallo Welt!',0x0a
len equ $-msg
```

Grüße,
Matthias


----------



## Schnacki (22. Dezember 2007)

Danke schonmal für die Antwort



> Und im Datenbereich:
> Code:
> 
> section .data
> ...



Aber genau so möchte ich das ja nicht machen.
Ich möchte halt Speicher während der Laufzeit reservieren, um darin dann einen String abzuspeichern.


----------



## Matthias Reitinger (22. Dezember 2007)

Schnacki hat gesagt.:


> Aber genau so möchte ich das ja nicht machen.
> Ich möchte halt Speicher während der Laufzeit reservieren, um darin dann einen String abzuspeichern.


Und woher soll der String kommen, wenn nicht aus dem Datenbereich? Irgendwo muss er ja schließlich stehen.


----------



## Schnacki (22. Dezember 2007)

Ich schreibe im Moment einen kleinen Compiler, in dem es auch Zeichenvektoren geben soll.
Und dafür müsste ich halt dynamisch Speicher reservieren.


----------



## Matthias Reitinger (22. Dezember 2007)

Schnacki hat gesagt.:


> Ich schreibe im Moment einen kleinen Compiler, in dem es auch Zeichenvektoren geben soll.
> Und dafür müsste ich halt dynamisch Speicher reservieren.


Das klappt doch mit deinem Code. Der Fehler lag ja nur darin, wie du den reservierten Speicher mit Daten gefüllt hast.


----------



## Schnacki (23. Dezember 2007)

Ja danke, 
stimmt
wie kann man denn den reservierten Speicher mit Daten füllen?

Weil mit mov kann man ja höchstens 4 Byte verschieben...


----------



## Matthias Reitinger (23. Dezember 2007)

Schnacki hat gesagt.:


> Ja danke,
> stimmt
> wie kann man denn den reservierten Speicher mit Daten füllen?


Z.B. mit _movsb_, siehe oben.



Schnacki hat gesagt.:


> Weil mit mov kann man ja höchstens 4 Byte verschieben...


Dann muss du den Befehl eben mehrmals ausführen.


----------



## Schnacki (23. Dezember 2007)

ok, danke, ich werde mir das mal anschauen.


----------

