Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: linux asm interups  (gelezen 1309 keer)

Offline xellos

  • Lid
linux asm interups
« Gepost op: 2009/11/04, 19:01:23 »
ik ben bezig om assembly te leren maar kom er niet uit.
ik wil nu de nanosleep interupt leren maar kan er niks over vinden en alles is in c
weet iemand een interupt list 80h waar bij je ook voorbeelden krijgt?

Offline track

  • Lid
Re: linux asm interups
« Reactie #1 Gepost op: 2009/11/05, 13:27:23 »
Hoi xellos,
interrups ??                             

Linux is noch DOS noch Win.. !   
Vandaar is ook het kernel-interface niet op een  INT21 (of zoiets) gebaseert maar op  C- functies:
http://stackoverflow.com/questions/724048/where-can-i-find-an-interrupt-list-for-i486-linux-gnu-instruction-set

Alleen voor hardware-gerelateerde taken worden INT's gebruikt:
http://www.cyberciti.biz/faq/howto-display-iros-under-linux/

Om het gehele programmeermodel beter te overzien zal je misschien ook hier kijken:
http://linux.die.net/man/  met name de "section 2".

track

Re: linux asm interups
« Reactie #2 Gepost op: 2009/11/05, 16:02:17 »

Offline Mossie

  • Lid
Re: linux asm interups
« Reactie #3 Gepost op: 2009/11/05, 16:37:45 »
Linux gebruikt system calls. Dit zijn eigenlijk een soort functies. Om een system call aan te roepen moet je een paar dingen doen:
1. Nummertje van de system call weten (staat in /usr/include/asm/unistd_32.h voor 32 bit, en /usr/include/asm/unistd_64.h voor 64 bit).
2. Dit nummertje plaats je in EAX.
3. De argumenten van de system call in de andere registers plaatsen (argumenten kan je in de manpages zien).
4. Interrupt 0x80 (of 80h) aanroepen.

Voorbeeld:
.section .data
string: ; adres van de string "Hallo wereld!".
.ascii "Hallo wereld!\n"

.section .text
.global _start
_start:
movl $4, %eax ; 4 is het nummer van de system call write. Dit getal moet je aanpassen voor een andere system call.
movl $1, %ebx ; ;1e argument van write is een file descriptor. In dit geval 1 (stdout).
movl $string, %ecx ;2e argument van write is een adres van een string.
movl $14, %edx ;3e argument van write is de lengte van de string. In dit geval 14.
int $0x80 ;interrupt 0x80 aanroepen waardoor kernel de system call uit gaat voeren. De returnwaarde staat in EAX.

movl $1, %eax ;roep de system call exit aan.
movl $0, %ebx
int $0x80
Ik hoop dat dit je een beetje op weg helpt. Het nummer van nanosleep is trouwens 162.

Offline track

  • Lid
Re: linux asm interups
« Reactie #4 Gepost op: 2009/11/05, 17:39:23 »
Die aanpak lijkt mij toch erg DOS-achtig.
Misschien werkt het "quick-and-dirty" ook.

Maar bij alle echte bestuursystemen moet je toch rekening houden met de rechten
en hoe je hen meeneemt of wijzigt.

Als je die INT80 oproept, hoe stel je dan van tevoren de "Interrupt Descriptor Table" enz. in ?
Want die hoort onvermijdelijk bij iedere INT (groter 16 bit) !
En, ben je er zeker van dat je niet de veiligheid corrumpeert ?

Dergelijke overwegingen heb je niet nodig als je netjes de C- calls gebruikt,  zonder INT,
want die houden er vanzelf rekening mee.

track
« Laatst bewerkt op: 2009/11/05, 17:42:36 door track »

_san

  • Gast
Re: linux asm interups
« Reactie #5 Gepost op: 2009/11/08, 18:13:52 »
Waarom wil je geen C of C++ gebruiken?