Autor Wątek: Pierwsze zajęcia z assemblera  (Przeczytany 2260 razy)

Offline MofC

  • Użytkownik

# Marzec 11, 2015, 22:08:07
Witam!
Ostatnio przeżyłem niemały szok na studiach za sprawą pierwszych labolatoriów z Architektury Systemów Komputerowych. Otóż trzeba było sprawdzić ile taktów zajmuje procesorowi przeniesienie wartości z różnych miejsc( pamięć, rejestry) różnych wielkości. Nie mieliśmy wcześniej nic z assemblera a z instrukcji niewiele się dowiedziałem.

http://hector.tu.kielce.pl/przedmioty/ask-lab/ask-lab-0102.html

Byłbym bardzo wdzięczny gdyby ktoś wytłumaczył mi jeszcze jak dodawać o odejmować liczby większe od 32 bitów (większe od pojemności rejestrów)
« Ostatnia zmiana: Marzec 11, 2015, 23:14:07 wysłana przez MofC »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Oti

  • Użytkownik

# Marzec 11, 2015, 22:51:19
Jeśli chcesz przedstawić liczbę, dajmy na to, 64-bitową operując na 32 bitowych rejestrach, to naturalnie musisz ją zapisać w dwóch rejestrach. Jeden z nich to bity wysokie(od 63 do 32) a drugi to niskie(od 31 do 0). Żeby zrealizować odejmowanie, należy dla obu 64-bitowych liczb odjąć ich wyrazy niskie za pomocą instrukcji SUB(subtract) a następnie odjąć ich wyrazy wysokie instrukcją SBB(subtract with borrow)*. Dlaczego dwie różne instrukcje? Jak zapewne pamiętasz z podstawówki, przy odejmowaniu pisemnym czasem trzeba sobie 'pożyczyć' coś z wyższej cyferki, żeby móc odjąć te niższe. I to jest właśnie to 'borrow'. Przy instrukcji SUB, w razie potrzeby jeden bit zostaje zapożyczony i ustawiana jest odpowiednia flaga w procesorze, a instrukcja SBB odpowiednio uwzględnia stan tejże flagi i odpowiednio go aktualizuje. SUB jedynie aktualizuje flagę, nie uwzględnia jej poprzedniej wartości.

Dla dodawania analogicznie-ADD dla pierwszego wyrazu i ADC(add with carry, dodanie z przeniesieniem) dla każdego następnego.

*)Nie jestem pewien-możliwe, że zamiast SBB będzie instrukcja SBC, która wykorzystuje flagę carry zamiast borrow, ale działa tak samo.

(..)gdyby ktoś wytłumaczył mi jeszcze jak dodawać (..)
Jak to 'jeszcze'? Nie zadałeś żadnego innego pytania poza tym dodawaniem i odejmowaniem.
« Ostatnia zmiana: Marzec 11, 2015, 22:53:23 wysłana przez Oti »

Offline koirat

  • Użytkownik

# Marzec 11, 2015, 23:05:12
"rdtsc" do liczenia taktów -> To było chyba to pierwsze pytanie.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 12, 2015, 15:53:46
Cytuj
Otóż trzeba było sprawdzić ile taktów zajmuje procesorowi przeniesienie wartości z różnych miejsc( pamięć, rejestry) różnych wielkości.
Zajmie od zera do praktycznie nieskończoności.

Zero - w przypadku gdy ta wartość była już odczytywana i już jest w jakimś rejestrze wirtualnym, albo procek uzna że nie ma po co tej wartości odczytywać.

Praktycznie nieskończoność - jeżeli odczytywana komórka leży w memory mapped file, sam plik jest udziałem sieciowym, a sieć właśnie nam padła. W takim układzie próba odczytu pamięci może wygenerować przerwanie odczytu strony do systemu operacyjnego, a sam system może to już młócić dowolnie długo.


Generalnie to pomiar czasu działania pojedynczych instrukcji na x86 przestał mieć już sens w okolicach przełomu wieków. Obecne procesory x86 mogą wykonywać po 5 i więcej instrukcji równolegle, a niektórych instrukcji nie wykonają w ogóle, jeśli uznają że nie ma takiej potrzeby.


EDIT: Z treści laborki: "Obecnie jądro mikroprocesora 8086 stanowi niewielką część nowoczesnych mikroprocesorów." -- obecnie jądro mikroprocesora 8086 kurzy się wyłącznie na półkach muzeów. Dzisiejsze procesory jedyne co mają wspólnego, to że przyjmują instrukcje x86, ale podobieństwo na tym się kończy. Instrukcje x86 są przetwarzane na sekwencje operacji, optymalizowane, przestawiane, itp, itd. Jądra 8086 tam nie uświadczysz.
« Ostatnia zmiana: Marzec 12, 2015, 15:59:48 wysłana przez Krzysiek K. »

Offline voytech

  • Użytkownik

# Marzec 14, 2015, 06:45:10
Witam!
Ostatnio przeżyłem niemały szok na studiach za sprawą pierwszych labolatoriów z Architektury Systemów Komputerowych. Otóż trzeba było sprawdzić ile taktów zajmuje procesorowi przeniesienie wartości z różnych miejsc( pamięć, rejestry) różnych wielkości. Nie mieliśmy wcześniej nic z assemblera a z instrukcji niewiele się dowiedziałem.

Zdaje się że w punkcie 3, podpunkt 4 masz podane jak powinieneś mierzyć ilość taktów dowolnej instrukcji.

Każde "mov eax,100" zastąp swoją instrukcją, której czas masz zmierzyć i dalej postępuj zgodnie z instrukcjami ćwiczeń.


Zajmie od zera do praktycznie nieskończoności.

Jestem prawie pewien, że na PŚK mają jakieś wiekowe pecety i pomiar instrukcją rdtsc o dziwo da całkiem sensowne wyniki :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 14, 2015, 20:37:57
Cytuj
Jestem prawie pewien, że na PŚK mają jakieś wiekowe pecety i pomiar instrukcją rdtsc o dziwo da całkiem sensowne wyniki :)
Pod warunkiem że tą instrukcję one wspierają. ;)