linux assembly in datei schreiben

Hi,

ich habe ein kleines Problem. Ich will in assembly etwas in eine Datei schreiben, der Code sieht bis jetzt so aus :

Code:
section .data
	msg:	db	"Test Datei"  ; message to save
	file:   db  "test.txt"    ; file name
	fd:     db                ; file descriptor 
	
section .text
	global _start
	
_start:
	jmp _open    ; open the file
	jmp _write   ; write into file
	jmp _exit    ; terminate

_open:
	mov eax,5	 ; sys call open
	mov ebx,file ; file name
	mov ecx,
	mov edx, 
	int 0x80     ; call the kernel

_write:
	mov eax,4    ; sys call write
	mov ebx,     ; 
	mov ecx,msg  ; text message to save
	mov edx,10   ; text length
	int 0x80     ; call the kernel

_exit:
	mov eax,1    ; sys call exit
	mov ebx,0    ; return value

In fd soll der File Deskriptor abgelegt werden ( muss er ja auch oder ? ). Mein Problem ist nun in _open. Was kommt dafür in ecx und edx ?

In _write muss dann ja anschliessend in ebx der File Deskriptor ?!

THX

Nachtrag :

Wie kann ich mir unter .data die Länge von msg berechnen lassen ?
 
Die Länge berechnet man so (zumindest in nasm, danach sieht's aus):
Code:
msg:	db	"Test Datei"  ; message to save
length:	equ	$ - msg
$ ist die aktuelle Adresse, davon ziehst du die Startadresse von msg ab (das muss direkt nach dem String kommen, sonst geht's natürlich nicht).

Aus der Manpage zu open: O_RDONLY, O_WRONLY or O_RDWR

Bei solchen Konstanten hat man meist Zweierpotenzen als Wert, also 1, 2, 4 etc. Binär wär das ja hier 001, 010, und 100, also ein Bit für jede Konstante. Zum schreiben müsste also ne 2 in ECX, in EDX kommt dann 0.

Im Zweifel kann man sich dann ein C-Programm mit printf("%i\n", O_RDONLY) basteln.

Das mit dem Deskriptor kann man z.B. so machen:
Code:
section .data
...
        fd:     dd 0x00000000   ;; 1 Integer
...
_open:
        mov     eax, 5
        mov     ebx, file
        mov     ecx, 2
        xor     edx, edx
        int     0x80
        mov     [fd], eax
...     
_write:
        mov     eax, 4
        mov     ebx, [fd]
...

Alternativ kannst du (in deinem Beispiel) EAX direkt nach EBX kopieren und dann write ausführen oder den Stack benutzen. Die Methode find ich aber am verständlichsten.

Übrigens: Die JMPs kannst du dir da sparen. Der springt nach _open und läuft dann bis zum Ende durch, das JMP _write wird nie ausgeführt. Am Ende fehlt noch INT 0x80.
 
Danke für die Antwort, hat jetzt auch geklappt.

zu jmp:
Hast recht

zu int 0x80:
habe ich nachher auch noch reingemacht


Alternativ kannst du (in deinem Beispiel) EAX direkt nach EBX kopieren und dann write ausführen oder den Stack benutzen

Ja, nur assembly Programme sind manchmal schwer zu lesen, daher auf die "dumme" art :rolleyes:

THX
 
Zurück
Oben