Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: robert 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
-
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
-
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....
-
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
-
das problem ist das $ den offset an der aktuellen position enthält und der wird bei der kompilierung berechnet ist so ne art makro.
-
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
-
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
-
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
-
Bitte Bitte :)