Wydanie R2020.04.1
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
Reference in New Issue
Block a user