Wydanie R2020.04.1

This commit is contained in:
Jan Potocki
2020-04-04 13:15:45 +02:00
parent afa69c2377
commit 760d5a8617
4 changed files with 102 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
hex: hex.o
ld hex.o -o hex
hex.o: hex.s
as hex.s -o hex.o
all: hex
clean:
rm hex
+9
View File
@@ -0,0 +1,9 @@
Należy napisać program, który będzie:
* Odczytywał ciąg bajtów ze standardowego strumienia wejściowego. Długość ciągu bajtów może być dowolna. Kombinacje bitów w bajtach także mogą być dowolne.
* Dla każdego odczytanego bajtu należy wypisać na standardowy strumień wyjściowy 3 bajty, z których ostatni będzie kodem ASCII spacji, a dwa pierwsze będą kodami ASCII cyfr szesnastkowych. Te cyfry mają utworzyć taką reprezentację w systemie naturalnym szesnastkowym, dla której odpowiadająca jej reprezentacja w systemie naturalnym dwójkowym (który jest systemem o bazie skojarzonej z systemem N16) będzie miała taki sam układ bitów, jak bajt odczytany ze standardowego strumienia wejściowego.
Dla przykładu:
Jeśli odczytany bajt byłby kodem ASCII znaku '0', to zawierałby bity "00110000" (bit najbardziej znaczący z lewej strony). Dla takiego odczytanego bajtu należy na standardowe wyjście wypisać kolejno bajty o układach bitów "00110011", "00110000", "00100000", czyli kody ASCII znaków '3', '0' i ' ', za pomocą których można zapisać reprezentację szesnastkową 30_N16 odpowiadającą reprezentacji binarnej 00110000_NB.
Przykładowe dane wejściowe i wymagane odpowiedzi są dostępne pod adresem: http://zak.iiar.pwr.edu.pl/materials/architektura/laboratorium%20AK2/Dane/hex.tar.bz2
+83
View File
@@ -0,0 +1,83 @@
# 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
Binary file not shown.