
Hello World in Assembly
Programming in Intel x86-64 Assembly
In the course "Systemnahe Programmierung" (translates to "System-Level Programming"), we spent some time working with assembly language. Much to our dismay, this didn't just involve reading and understanding assembly code, we also had to write it ourselves. This meant creating small programs, compiling them, and actually running them.
To understand how function calls work in assembly, we had to write a program that reads a string using fgets, converts it to uppercase, and prints it to the console.
puts
fgets
stdin
toupper
; 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 ; ReturnThis can be compiled using the following short Makefile:
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.oFeel free to leave your opinion or questions in the comment section below.