84 lines
1.7 KiB
ArmAsm
84 lines
1.7 KiB
ArmAsm
# Jan Potocki 2020
|
|
|
|
# Definicje numerow funkcji systemowych i ich parametrow
|
|
SYSEXIT64 = 60
|
|
SYSREAD = 0
|
|
SYSWRITE = 1
|
|
STDIN = 0
|
|
STDOUT = 1
|
|
|
|
.global _start
|
|
|
|
# Segment niezainicjalizowanych danych
|
|
.bss
|
|
|
|
bajt: .space 1 # Bufor na dane wejsciowe (1 bajt)
|
|
tekst: .space 3 # Bufor na dane wyjsciowe (3 bajty)
|
|
|
|
# Segment kodu
|
|
.text
|
|
|
|
_start:
|
|
mov $tekst, %r8 # r8 - adres bufora wyjsciowego
|
|
movb $' ', 2(%r8) # Wpisanie spacji do bufora wyjsciowego
|
|
|
|
# Glowna petla
|
|
petla:
|
|
mov $SYSREAD, %rax # Wczytanie danych ze standardowego wejscia
|
|
mov $STDIN, %rdi # ...funkcja systemowa read
|
|
mov $bajt, %rsi
|
|
mov $1, %rdx
|
|
syscall
|
|
|
|
cmp $0, %rax # rax - liczba wczytanych bajtow (zwrocona)
|
|
je koniec # Jezeli 0, to skonczyly sie dane
|
|
|
|
movb bajt, %al # W al zajmiemy sie mlodszymi bitami
|
|
mov %al, %bl # W bl zajmiemy sie starszymi bitami
|
|
|
|
shr $4, %al # Wyizolowanie 4 starszych bitow
|
|
cmp $10, %al
|
|
jl znakA1 # Cyfry 0-9
|
|
jmp znakA2 # Cyfry A-F
|
|
|
|
mlodsze:
|
|
and $0x0F, %bl # Wyizolowanie 4 mlodszych bitow
|
|
cmp $10, %bl
|
|
jl znakB1 # Cyfry 0-9
|
|
jmp znakB2 # Cyfry A-F
|
|
|
|
zapis:
|
|
movb %al, 0(%r8) # Zapis rezultatow w buforze wyjsciowym
|
|
movb %bl, 1(%r8)
|
|
|
|
mov $SYSWRITE, %rax # Wypisanie wyniku na standardowe wyjscie
|
|
mov $STDOUT, %rdi # ...funkcja systemowa write
|
|
mov $tekst, %rsi
|
|
mov $3, %rdx
|
|
syscall
|
|
|
|
jmp petla # Koniec glownej petli
|
|
|
|
# Wyjscie z programu
|
|
koniec:
|
|
mov $SYSEXIT64, %rax
|
|
mov $0, %rdi
|
|
syscall
|
|
|
|
# Konwersja na ASCII
|
|
znakA1:
|
|
add $48, %al # 48 -> kod ASCII zera
|
|
jmp mlodsze
|
|
|
|
znakA2:
|
|
add $55, %al # 55+10=65 -> kod ASCII litery A
|
|
jmp mlodsze
|
|
|
|
znakB1:
|
|
add $48, %bl # 48 -> kod ASCII zera
|
|
jmp zapis
|
|
|
|
znakB2:
|
|
add $55, %bl # 55+10=65 -> kod ASCII litery A
|
|
jmp zapis
|