Autor Thema: Problem mit Argumenten  (Gelesen 4348 mal)

robert

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« am: 24. June 2004, 22:08 »
Hallo,

ich habe vor gehabt ein argument was bei einem Programmaufruf uebergeben wird ueber sys_write auszugeben. Bekanntlich ist das 3. Argument von sys_write die laenge des zu schreibenen buffers. Nun weiss ich leider nicht wie ich die herausbekommen soll :-/

Bis jetzt:

pop  ebx
pop  ebx        ; programname
pop  ebx        ; erstes uebergebenes argument
mov  eax,4     ; syscall: sys_write
mov  ebx,1     : erstes argument: STDOUT
mov  ecx,ebx ;  argument nach ecx ( 2. Argument fuer sys_write: buffer )
; nun muesste noch die laenge von ecx nach edx
; ich habe schon mit $-ecx probiert aber das akzeptiert nasm nicht

\\Robert

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. June 2004, 11:50 »
Hi,

ehrlich gesagt weiß ich garnicht was du sagen willst mir deinem Post :)
Also, ich hab Syscalls früher so gemacht.

Erstmal eine Funktion die einen Interrupt aufruft:
_DoSyscall:
    pop edx
    pop ecx
    pop ebx
    pop eax
    int 0x80
    ret

Und in C sieht das jetzt so aus...
#define uint unsigned int


extern uint DoSyscall(uint eax,uint ebx,uint ecx,uint edx);


int write(int filenum,void *buffer,uint count)
{
    return DoSyscall(0,filenum,buffer,count);
}

Jetzt brauchen wir noch einen Interrupt Handler für int 0x80...
[Extern _sys_write]
[Extern _sys_read]


Syscall:
    cmp eax,0
    je .write
    cmp eax,1
    je .read

    mov eax,-1
    jmp .end

    .write:
    push ebx ;filnum
    push ecx ;buffer
    push edx ;count
    call _sys_write
    jmp .end

    .read:
    push ebx ;filnum
    push ecx ;buffer
    push edx ;count
    call _sys_read
    jmp .end

    .end:
    iret

Und in unserem Kernel haben wir jetzt die funktionen sys_write und sys_read.

Wow, könnte schon fast ein Tutorial sein :)
Btw, es können Fehler auftregen, hab das grad so ausm Kopf geschrieben.

MfG GhostCoder
A man, a legend!

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 25. June 2004, 12:04 »
Also irgendwo auch www.linuxassembly.org habe ich ein Tutorial gesehen (so ein Hello-World-Programm) wo die länge so berechnet wird:
msg      db "Hello, World!"
msg_len db $ - msg
oder so ähnlich...falls es das war was du meintest....

robert

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 25. June 2004, 12:24 »
Ja, das komische meiner Meinung nach ist ja das dinge wie:
    msg_l  db  $-msg   gehen aber so wie ich es einsetzten wollte geht es einfach nicht :-/

@GhostCoder:
  also woher nimmst du denn bei deiner write funktion den count? Mir gehts ja darum
  wie ich wenn ich mit Registern arbeite die einen fuer mich unbekannten text enthalten
  die laenge des Textes fuer den Count herausbekomme.
   Oder koennte man da einfach mal ganz frei ne hohe Zahl einsetzten und das Thema    
   ist erledigt

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #4 am: 25. June 2004, 15:55 »
das problem ist das $ den offset an der aktuellen position enthält und der wird bei der kompilierung berechnet ist so ne art makro.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

robert

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 25. June 2004, 16:41 »
Hmm, aber wie soll ich sonst den count fuer sys_write herausbekommen?
Ich seh da im mom keine richtige moeglichkeit wie ich den count herausbekommen koennte.

Hoffe ihr koennt mir helfen :)

\\Robert

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 25. June 2004, 16:49 »
Achso, du meinst, wenn du z.b. in edx nen pointer auf nen string hast?
Wenn ja, würde ich das so machen (ich hoffe diesmal hilft dir die antwort) :)

_strlen:
    mov esi,edx        ; Zeiger in esi speichern
    xor eax,eax        ; eax (Count) auf null setzen

    .Loop:
    cmp byte [esi],0    ; Aktuelles Zeichen mit 0 vergleichen
    je .End            ; Gleich? dann zum ende
    inc esi            ; Nächstes zeichen
    inc eax            ; Count erhöhen
    jmp .Loop

    .End:
    ret

Jetzt kannst du, wenn du in edx ein Zeiger auf einen String hast, per "call _strlen" die länge herausfinden. Siewird in eax gespeichert. Aber aufpassen, vilt musste eax vorher pushen wenn "wichtige" Daten drinsind.

Hoffe geholfen zuhaben,
MfG GhostCoder
A man, a legend!

robert

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 25. June 2004, 18:37 »
Jo, so in der art hab ich mir auch was grad aufgebaut aber hat noch nicht funktioniert aber es sollte sowas werden wie du erstellt hast ;) ..Danke

\\Robert

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 25. June 2004, 18:40 »
Bitte Bitte :)
A man, a legend!

 

Einloggen