Compare commits
2 Commits
523a597a4d
...
760d5a8617
| Author | SHA1 | Date | |
|---|---|---|---|
| 760d5a8617 | |||
| afa69c2377 |
@@ -1,16 +1,20 @@
|
|||||||
# AK2 - lab 2019
|
# 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.
|
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 będzie na bieżąco aktualizowane.
|
Repozytorium powstało w 2019 i będzie na bieżąco aktualizowane.
|
||||||
|
|
||||||
Przydatne linki:
|
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:
|
* 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
|
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:
|
* 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
|
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:
|
* 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
|
https://www.uclibc.org/docs/psABI-i386.pdf
|
||||||
* Using as – dokumentacja GNU Assembler, opis składni:
|
* Using as – dokumentacja GNU Assembler, opis składni:
|
||||||
https://sourceware.org/binutils/docs/as/
|
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):
|
* C++ reference/C reference – dokumentacja języków C/C++ (przydatne przy łączeniu kod w C i asemblerze):
|
||||||
https://en.cppreference.com/w/
|
https://en.cppreference.com/w/
|
||||||
* Opis podstawowych typów w językach C/C++ i ich długości w różnych modelach danych:
|
* 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