Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 760d5a8617 | |||
| afa69c2377 |
@@ -1,16 +1,20 @@
|
||||
# AK2 - lab 2019
|
||||
Trochę różnych programów napisanych przy pomocy z rozwiązywaniem zadań od mgr Aleksandry Postawki na zajęciach laboratoryjnych z Architektury komputerów 2, w formie materiałów dydaktycznych – kod szczegółowo opisany w komentarzach.
|
||||
Repozytorium będzie na bieżąco aktualizowane.
|
||||
# AK2 - lab 2019+
|
||||
Trochę różnych programów napisanych przy pomocy z rozwiązywaniem zadań od mgr Aleksandry Postawki, mgra Tomasza Serafina, dra Tadeusza Tomczaka (i innych) na zajęciach laboratoryjnych z Architektury komputerów 2, w formie materiałów dydaktycznych – kod szczegółowo opisany w komentarzach.
|
||||
Repozytorium powstało w 2019 i będzie na bieżąco aktualizowane.
|
||||
|
||||
Przydatne linki:
|
||||
* Intel 64 and IA-32 Architectures Software Developer’s Manual (Combined Volumes) – opis architektury procesorów x86 i spis wszystkich rozkazów asemblera:
|
||||
https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf
|
||||
* Linux System Call Table – spis funkcji systemowych Linuxa dla 32- i 64-bitowej wersji x86 w przejrzystej formie:
|
||||
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md
|
||||
* System V Application Binary Interface AMD64 – opis 64-bitowej konwencji wywołań x86 używanej w systemach z rodziny Linux:
|
||||
https://www.uclibc.org/docs/psABI-x86_64.pdf
|
||||
* System V Application Binary Interface i386 – opis 32-bitowej konwencji wywołań x86 używanej w systemach z rodziny Linux:
|
||||
https://www.uclibc.org/docs/psABI-i386.pdf
|
||||
* Using as – dokumentacja GNU Assembler, opis składni:
|
||||
https://sourceware.org/binutils/docs/as/
|
||||
* Wikibooks – Asembler x86 (wersja dla składni AT&T):
|
||||
https://pl.wikibooks.org/wiki/Asembler_x86/Spis_GNU_AS
|
||||
* C++ reference/C reference – dokumentacja języków C/C++ (przydatne przy łączeniu kod w C i asemblerze):
|
||||
https://en.cppreference.com/w/
|
||||
* Opis podstawowych typów w językach C/C++ i ich długości w różnych modelach danych:
|
||||
|
||||
@@ -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