Assemblersprache

Aus Tuxfutter

(Weitergeleitet von Assembler)
Wechseln zu: Navigation, Suche

Die Assemblersprache ist eine spezielle Programmiersprache, welche die Maschinensprache einer spezifischen Prozessor-Architektur in einer für den Menschen lesbaren Form repräsentiert. Jede Computer-Architektur hat folglich ihre eigene Assemblersprache oder -dialekt. Die Assemblersprache bietet dabei nur ganz einfache Programmierhilfen, wie das Vergeben eines Namens für eine Speicherzelle, das Berechnen von Sprungdistanzen und die Möglichkeit, den Programmcode zu kommentieren. Zum Übersetzen des Quelltextes in ein ausführbares Programm, wird ein dazu passender Assembler-Compiler benötigt.

Inhaltsverzeichnis

[Bearbeiten] Weitere Details

Assembler-Programmierung unter Linux, dem plattformunabhängigen Betriebssystem?

Ja, das geht!

Natürlich legt man sich dann auf eine Hardware-Plattform fest, aber im Embedded-Bereich wird Assembler auch heute noch gerne verwendet, um Mikrocontroller zu programmieren.

[Bearbeiten] Beispiele

[Bearbeiten] Der Mount-Befehl

Ein Beispielprogramm für den Mount-Befehl unter Linux, das mit dem GNU-Assembler As übersetzt werden kann ist folgendes:

        .section .data

        .align 4

mountdata:
        .long 0

        .section .text

        .globl _start

        .align 4
_start:
        movl %esp, %ebp         # store %esp in %ebp
_mount:
        addl $8, %esp           # %esp ---> second parameter on stack
        movl (%esp), %ebx       # move next parameter into %ebx
        addl $4, %esp           # %esp ---> third parameter on stack
        movl (%esp), %ecx       # move next parameter into %ecx
        addl $4, %esp           # %esp ---> fourth parameter on stack
        movl (%esp), %edx       # move next parameter into %edx
        movl $0xc0ed0080, %esi  # MS_MGC_VAL | S_WRITE
        leal mountdata, %edi    # pointer to 0
        movl $21, %eax          # system call _mount
        int $0x80
_exit:
        movl %eax, %ebx         # give back return value
        xorl %eax, %eax         # %eax = 0
        incl %eax               # %eax = 1, system call _exit ()
        int $0x80               # execute _exit () system call

Das fertig übersetzte und gelinkte Programm ist nur etwa 800 Bytes groß.

[Bearbeiten] i386-Programmierung

Ein Assemblerprogramm für einen i386-Prozessor (und höher) sieht für den GNU-Assembler as zum Beispiel so aus:

hauke@fafnir:~/src/mylios$ cat loader.s
.global loader                 # making entry point visible to linker

# setting up the Multiboot header - see GRUB docs for details
.set ALIGN,    1<<0             # align loaded modules on page boundaries
.set MEMINFO,  1<<1             # provide memory map
.set FLAGS,    ALIGN | MEMINFO  # this is the Multiboot 'flag' field
.set MAGIC,    0x1BADB002       # 'magic number' lets bootloader find the header
.set CHECKSUM, -(MAGIC + FLAGS) # checksum required

.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM

# reserve initial kernel stack space
.set STACKSIZE, 0x4000          # that is, 16k.
.comm stack, STACKSIZE, 32      # reserve 16k stack on a quadword boundary

loader:
   mov   $(stack + STACKSIZE), %esp # set up the stack
   push  %eax                       # Multiboot magic number
   push  %ebx                       # Multiboot data structure

   call  kmain            # call kernel proper
   hlt                    # halt machine should kernel retur
hauke@fafnir:~/src/mylios$

[Bearbeiten] Weblinks

'Persönliche Werkzeuge