diff --git a/lab1-v3/Makefile b/lab1-v3/Makefile new file mode 100644 index 0000000..a7a2b87 --- /dev/null +++ b/lab1-v3/Makefile @@ -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 diff --git a/lab1-v3/README.md b/lab1-v3/README.md new file mode 100644 index 0000000..5509be2 --- /dev/null +++ b/lab1-v3/README.md @@ -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 diff --git a/lab1-v3/hex.s b/lab1-v3/hex.s new file mode 100644 index 0000000..f75c6ee --- /dev/null +++ b/lab1-v3/hex.s @@ -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 diff --git a/lab1-v3/hex.tar.bz2 b/lab1-v3/hex.tar.bz2 new file mode 100644 index 0000000..5e2c0be Binary files /dev/null and b/lab1-v3/hex.tar.bz2 differ