Assemblersprache
Aus Tuxfutter
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
- Assemblersprache – Artikel bei der Wikipedia

