Hello World in Assembly

Programmieren in Intel x86-64 Assembly

#Intel x86-64 Assembly#Bachelorstudium#Sonstiges#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?