Assembly Programmierung
Programmieren in Intel x86-64 Assembly
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.
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.
; RDI, RSI, RDX, RCX, R8
.data
msg: db 'Hello ',13,10,'world!',13,10,0 ; Zero is Null terminator
input: times 21 db 0 ;
.text
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
puts
fgets
stdin
toupper
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
Noch Fragen?