Ankündigung

Einklappen
Keine Ankündigung bisher.

Erstes Assemblerprogram

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Erstes Assemblerprogram

    Um Assembler ein bisschen zu verstehen, habe ich mal mit diesem Program angefangen. Ich weiss nicht ob es so korrekt ist. Funktionieren tut es jedenfalls:

    Es gibt "ABC" aus !

    Der Code ist natürlich etwas lange, weil ich testhalber noch einen Loop drin habe. Das Problem, welches ich habe ist, dass für jeden Buchstaben z.Z. 32bit im Stack resserviert werden. Kann man das anders machen ?

    ;Kompilieren mit
    ;---------------
    ;nasm -f elf ausgabe.asm
    ;gcc -Wall -s -nostdlib ausgabe.o
    ;./a.out

    BITS 32 ;32bit modus

    ;-------------------------------------------------------------------------------

    SECTION .text ;Code muss sich in GCC unter ".text" befinden

    GLOBAL _start ;start Eintrittspunkt
    _start:
    xor eax,eax

    _loop1:
    inc al
    cmp al, 0x43
    jne _loop1
    push eax

    xor eax,eax ;eax auf 0
    mov al,0x42 ;letter B
    push eax

    xor eax,eax ;eax auf 0
    mov al,0x41 ;letter A
    push eax

    mov ebp, esp ;stackpointer -> basepointer

    mov edx,0x0b ;Argument 3: Länge des Strings
    mov ecx,ebp ;Argument 2: Basepointer hat Adresse von Stackpointer
    mov ebx,0x01 ;Argument 1: Auf Bildschirm ausgeben
    mov eax,0x04 ;Funktion: Write command
    int 0x80 ;Interrupt 80 hex, Kernelaufruf (Systemcall)

    mov eax,0x01 ;Argument 1: Call sys_exit()
    mov ebx,0x42 ;Argument 2: Rueckgabewert
    int 0x80 ;Interrupt beendet prozess

    ;-------------------------------------------------------------------------------
    Zuletzt geändert von schiri; 02.05.2005, 16:41.

  • #2
    Hier noch einen andere Version, davon. Meine Frage ist:
    Muss der STACK vor dem beenden des Programmes wieder gereinigt werden, oder tut dies der Kernel ?

    ;nasm -f elf ausgabe2.asm
    ;gcc -Wall -s -nostdlib ausgabe2.o

    BITS 32 ;32bit modus

    ;-------------------------------------------------------------------------------

    SECTION .text ;Code muss sich in GCC unter ".text" befinden

    GLOBAL _start ;start Eintrittspunkt
    _start:
    xor eax,eax ;eax, ebx, ecx und edx auf 0 setzen
    xor ebx,ebx
    xor ecx,ecx
    xor edx,edx

    mov dl,0x0a ;Return
    mov cl,'C' ;Zeichen C in cl speichern (cl = unterer Teil von ECX = 8 BIT)
    mov bl,'B' ;Zeichen B in cl speichern (bl = unterer Teil von EBX = 8 BIT)
    mov al,'A' ;Zeichen A in cl speichern (al = unterer Teil von EAX = 8 BIT)

    push edx ;alles auf den Stack legen (LiFo)
    push ecx
    push ebx
    push eax

    mov ebp, esp ;stackpointer -> basepoint
    ;Erklaerung: ESP hat die aktuelle STACK Adresse, diese
    ;speichern wir im Basepoint, da wir sie fuer den Systemcall
    ;wieder brauchen

    ;Aufbau des ersten Systemcalls (Ausgabe auf Bildschirm)
    mov edx,16 ;3.Argument: Laenge des strings
    mov ecx,ebp ;2.Argument: Pointer zu Adresse vo ABC anfaengt
    mov ebx,0x01 ;1.Argument: STDOUT
    mov eax,0x04 ;Functionsaufruf WRITE()
    int 0x80 ;Kernelinteruppt interrupt 80 hex, call kernel

    mov ecx, 0 ;ecx wir als counter verwendet, also auf 0 setzen

    ;Muessen die Daten wieder vom STACK gelöt werden, oder erledigt das der Kernel ?
    _loop1: ;clean up stack
    inc ecx ;counter um 1 erhoehen
    pop ebx ;stack poppen
    cmp ecx,4 ;vergleichen
    jne _loop1 ;jump zurueck wenn <> 3

    ;Aufbau des letzen Systemcalls (Prozess beenden)
    mov eax,0x01 ;Call sys_exit() 1.Argument
    mov ebx,eax ;Rueckgabewert 2.Argument aus eax lesen
    int 0x80 ;Am Schluss, Call ausführen ueber Software Interrupt 128 (0x80)

    ;-------------------------------------------------------------------------------

    Kommentar

    Lädt...
    X