Assembly Programmierung

Programmieren in Intel x86-64 Assembly

#Intel x86-64 Assembly#Bachelorstudium#Studium

Im Modul "Systemnahe Programmierung" haben wir uns unter anderem mit Assembler beschäftigt. Zu unser aller Leidwesen haben sich diese Bemühungen nicht auf das Lesen und Verstehen von Assembler-Code beschränkt, sondern auch das Schreiben von Assembler-Code beinhaltet. Dazu mussten wir kurze, eigene Programme verfassen, diese kompilieren und dann ausführen.

Beispielprogramm

Um zu verstehen, wie Aufrufe von Funktionen in Assembler funktionieren, mussten wir ein Programm schreiben, dass einen String mithilfe von fgets einließt, in Großbuchstaben umwandelt und auf der Konsole ausgibt.

extern puts extern fgets extern stdin extern toupper ; RDI, RSI, RDX, RCX, R8 SECTION .data msg: db 'Hello ',13,10,'world!',13,10,0 ; Zero is Null terminator input: times 21 db 0 ; SECTION .text global main main: push rbp ; Push stack ;String einlesen mov rdi, input mov rsi, 20 mov rdx, [stdin] call fgets ;loop mov r15, -1 ; r15 nehmen weil r9 an irgendeiner stelle überschrieben wird lop: inc r15 ; Aktuellen Char auslesen mov r8, 0 ;lea rax, [input+r15] ; load adress of current char to rax mov r8b, [input+r15] ; buffer current character ;Newlines (13 und 10) durch beep (7) ersetzen cmp r8b, 13 jne weiter mov r8b, 7 mov [input+r15+1], byte 7 weiter: ; In Großbuchstaben konvertieren mov rdi,r8 mov rax,0 call toupper ;Zurück in String schreiben mov [input+r15], al ;loop cmp al, 0 jne lop ;String ausgeben mov rdi, input mov rax,0 call puts pop rbp ; Pop stack mov rax,0 ; Exit code 0 ret ; Return

Dieses lässt sich zum Beispiel mit der folgenden kurzen Makefile kompilieren:

CFLAGS = -Wall -Wextra -v -no-pie -o all: comp comp: nasm -f elf64 -g -F dwarf -o glibber.o glibber.S clang $(CFLAGS) glibber glibber.o clean: rm -f glibber rm -f glibber.o

Kommentare

Noch Fragen?