Nieuws:

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

Auteur Topic: asm interupt read hoe te gebruiken  (gelezen 1792 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)