Nieuws:

Ubuntu-NL weer online!

Na een periode van technische problemen en een overbelaste server zijn we eindelijk weer bereikbaar.
Samen met Hobbynet, onze sponsor en hostingpartner, hebben we een oplossing gevonden zodat alles weer soepel draait.

Bedankt voor jullie geduld en begrip. We hopen nu weer verder te gaan waar we gebleven waren.

Het team van Ubuntu-NL

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

Auteur Topic: asm interupt read hoe te gebruiken  (gelezen 2560 keer)

Offline xellos

  • Lid
asm interupt read hoe te gebruiken
« Gepost op: 2009/08/10, 13:16:45 »
kan iemand mij vertellen hoe ik in asembly de read interupt moet gebruiken ?
ik heb overal gezocht maar kom er niet uit.
het enigste wat ik kan vinden is http://www.cin.ufpe.br/~if817/arquivos/asmtut/syscalls.html 
maar daar staat niet hoe ik het werkend kan krijgen in asm

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: asm interupt read hoe te gebruiken
« Reactie #1 Gepost op: 2009/08/10, 14:12:27 »
Welke assembler gebruik je? GAS, NASM? Dan kan ik het meteen in de juiste syntax gieten :) heb zelf het meest ervaring met NASM (Intel syntax) omdat ik AT&T syntax niet zo handig vind.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: asm interupt read hoe te gebruiken
« Reactie #2 Gepost op: 2009/08/10, 14:40:54 »
Kernel calls werken als volgt:
- wat er bij %eax staat steek je in eax
- het eerste argument steek je in ebx, het tweede in ecx, het derde in edx, enz...
- om de kernel call effectief uit te voeren roep je interrupt 0x80 aan via int 80h of int 0x80

----

Een voorbeeldje in NASM / Intel syntax:

; Enkele defines voor de assembler
STDIN: equ 0
STDOUT: equ 1
SYS_READ: equ 3
SYS_WRITE: equ 4

SYS_EXIT: equ 1
SUCCESS: equ 0

MAX_SIZE: equ 100

section .data
    message: db 'Wat wil je zeggen?', 10, 0 ; Bericht dat de gebruiker ziet + newline + nullbyte
    message_len: equ $-message ; Lengte van message in bytes
    outputmsg: db 'Je zei: ', 0
    outputmsg_len: equ $-outputmsg

section .bss
    input: resb MAX_SIZE ; Reserveer een string van MAX_SIZE bytes

section .text
    global _start
_start:
    ; Bericht weergeven
    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, message
    mov edx, message_len
    int 80h

    ; Lijn inlezen
    mov eax, SYS_READ
    mov ebx, STDIN
    mov ecx, input
    mov edx, MAX_SIZE
    int 80h
    
    ; Ingelezen lijn weergeven
    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, outputmsg
    mov edx, outputmsg_len
    int 80h
    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, input
    mov edx, MAX_SIZE
    int 80h

    ; Exit
    mov eax, SYS_EXIT
    mov ebx, SUCCESS
    int 80h

assembleren met: nasm -felf read.asm && ld -s -o read read.o
nadien uitvoeren met: ./read
« Laatst bewerkt op: 2009/08/10, 14:42:45 door profoX »
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline xellos

  • Lid
Re: asm interupt read hoe te gebruiken
« Reactie #3 Gepost op: 2009/08/10, 17:37:43 »
heel erg bedankt

Offline xellos

  • Lid
Re: asm interupt read hoe te gebruiken
« Reactie #4 Gepost op: 2009/08/10, 20:34:12 »
nog een vraag,
hoe weet je dat je bij stdin ebx de waarde 0 moet mee geven
en bij stdout de waarde 1?

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: asm interupt read hoe te gebruiken
« Reactie #5 Gepost op: 2009/08/10, 20:49:42 »
/usr/include/unistd.h voor die specifieke zaken,
maar gemakkelijker is natuurlijk Google ;)
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline xellos

  • Lid
Re: asm interupt read hoe te gebruiken
« Reactie #6 Gepost op: 2009/08/11, 13:09:56 »
ik kan het daar niet in vinden hoor

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: asm interupt read hoe te gebruiken
« Reactie #7 Gepost op: 2009/08/11, 13:16:28 »
wesley@zeN:~$ grep -i stdin /usr/include/unistd.h
#define STDIN_FILENO    0       /* Standard input.  */
wesley@zeN:~$ grep -i stdout /usr/include/unistd.h
#define STDOUT_FILENO   1       /* Standard output.  */
Maar zoals ik al zei... Google is makkelijker :) http://linux.die.net/man/3/stdin
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)