Floating Point Unit Koprocesor umożliwia działania na liczbach ułamkowych (zmiennoprzecinkowych) 8 rejestrów 80-bitowych: st0,,st7 Typy danych

Podobne dokumenty
Programowanie w asemblerze Obliczenia zmiennopozycyjne

Zuzanna Hartleb i Artur Angiel

Metody Realizacji Języków Programowania

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

ROZDZIAŁ CZTERNASTY: ARYTMETYKA ZMIENNO PRZECINKOWA

Struktura stanowiska laboratoryjnego

Architektura komputerów

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Podstawy Informatyki. Metalurgia, I rok. Wykład 3 Liczby w komputerze

Mikroinformatyka. Koprocesory arytmetyczne 8087, 80187, 80287, i387

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Architektura komputerów. Asembler procesorów rodziny x86

2 Przygotował: mgr inż. Maciej Lasota

Podstawy Programowania Podstawowa składnia języka C++

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 5 Liczby w komputerze

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

1 Podstawy c++ w pigułce.

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Typ użyty w deklaracji zmiennej decyduje o rodzaju informacji, a nazwa zmiennej symbolicznie opisuje wartość.

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Klasy: String, Random, Math. Korzystanie z dokumentacji.

Liczby rzeczywiste są reprezentowane w komputerze przez liczby zmiennopozycyjne. Liczbę k można przedstawid w postaci:

Reprezentacja stałoprzecinkowa. Reprezentacja zmiennoprzecinkowa zapis zmiennoprzecinkowy liczby rzeczywistej

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Zwykle liczby rzeczywiste przedstawia się w notacji naukowej :

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

SYSTEMY LICZBOWE. SYSTEMY POZYCYJNE: dziesiętny (arabski): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 rzymski: I, II, III, V, C, M

Podstawy programowania w języku C i C++

Struktura i działanie jednostki centralnej

Sprzęt i architektura komputerów

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Podstawy nauk przyrodniczych Matematyka Wstęp

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Stałe oznaczane są słowem kluczowym final. Do stałej wartość można przypisać tylko raz. Dobrą konwencją jest nazywanie stałych wielkimi literami

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Wyrażenia arytmetyczne

Mikrokontroler ATmega32. Język symboliczny

Wstęp do Programowania, laboratorium 02

III. Funkcje rzeczywiste

Ćwiczenie 3. Konwersja liczb binarnych

Architektura komputerów

DYDAKTYKA ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE

Architektura typu Single-Cycle

Wielkości liczbowe. Wykład z Podstaw Informatyki dla I roku BO. Piotr Mika

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

1 Podstawy c++ w pigułce.

LICZBY ZMIENNOPRZECINKOWE

Pracownia Komputerowa wykład VI

Komputer. Komputer (computer) jest to urządzenie elektroniczne służące do zbierania, przechowywania, przetwarzania i wizualizacji informacji

Wielkości liczbowe. Wykład z Podstaw Informatyki. Piotr Mika

PORÓWNANIE TREŚCI ZAWARTYCH W OBOWIĄZUJĄCYCH STANDARDACH EGZAMINACYJNYCH Z TREŚCIAMI NOWEJ PODSTAWY PROGRAMOWEJ

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

C++ wprowadzanie zmiennych

Pułapki liczb zmiennoprzecinkowych. Adam Sawicki asawicki.info

Arytmetyka stało i zmiennoprzecinkowa

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Pracownia Komputerowa wykład IV

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

* WWW: * * Adres: Instytut Informatyki ul. Będzińska Sosnowiec Pokój 214 * Telefon:

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Podstawy Informatyki

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

Arytmetyka binarna - wykład 6

002 Opcode Strony projektu:

Elementy oprogramowania sterowników. Instrukcje podstawowe, funkcje logiczne, układy czasowe i liczenia, znaczniki

ARCHITEKTURA KOMPUTERÓW Liczby zmiennoprzecinkowe

1. Operacje logiczne A B A OR B

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

Pracownia Komputerowa wyk ad IV

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Przedmiot: Urządzenia techniki komputerowej Nauczyciel: Mirosław Ruciński

Programowanie Niskopoziomowe

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

PRZELICZANIE JEDNOSTEK MIAR

Technika mikroprocesorowa I Wykład 2

JAVAScript w dokumentach HTML (1)

Podstawowe typy zmiennych

Programowanie Delphi obliczenia, schematy blokowe

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 2 WSTĘP DO INFORMATYKI

Podstawy Informatyki

LICZBY ZMIENNOPRZECINKOWE

Architektura komputerów

ARCHITEKRURA KOMPUTERÓW Kodowanie liczb ze znakiem

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Teoretyczne Podstawy Informatyki

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Procesory rodziny x86. Dariusz Chaberski

Transkrypt:

Lab 8 FPU

Floating Point Unit Koprocesor umożliwia działania na liczbach ułamkowych (zmiennoprzecinkowych) 8 rejestrów 80-bitowych: st0,,st7 Typy danych Pojedyncza precyzja. Liczby takie zajmują po 32 bity (4 bajty) i ich wartość maksymalna wynosi ok. 10 39 (10^39). Znane są programistom języka C jako float. Podwójna precyzja. 64 bity (8 bajtów), max = ok. 10 409 (10^409). W języku C są znane jako double Rozszerzona precyzja. 80 bitów (10 bajtów), max = ok. 10 4930 (10^4930). W języku C są to long double

Instrukcje przemieszczenia danych: FLD/FILD [mem] - załaduj liczbę rzeczywistą/całkowitą z pamięci. Dla liczby rzeczywistej jest to 32, 64 lub 80 bitów. Dla całkowitej - 16, 32 lub 64 bity. FST [mem32/64/80] - do pamięci idzie liczba ze st(0). FSTP [mem32/64/80] - zapisz st(0) w pamięci i zdejmij je ze stosu. Znaczy to tyle, że st(1) o ile istnieje, staje się st(0) itd. każdy rejestr cofa się o 1. FIST [mem16/32] - ewentualnie obciętą do całkowitej liczbę z st(0) zapisz do pamięci. FISTP [mem16/32/64] - jak wyżej, tylko ze zdjęciem ze stosu. FXCH st(i) - zamień st(0) z st(i).

Instrukcje ładowania stałych FLDZ - załaduj zero. st(0) = 0.0 FLD1 - załaduj 1. st(0) = 1.0 FLDPI - załaduj pi. FLDL2T - załaduj log2(10) FLDL2E - załaduj log2(e) FLDLG2 - załaduj log(2)=log10(2) FLDLN2 - załaduj ln(2)

Działania matematyczne: dodawanie: FADD, składnia identyczna jak w odejmowaniu prostym odejmowanie: FSUB [mem32/64] st := st-[mem] FSUB st(0),st(i) st := st-st(i) FSUB st(i),st(0) st(i) := st(i)-st(0) FSUBP st(i), st(0) st(i) := st(i)-st(0) i zdejmij FSUBP (bez argumentów) = FSUBP st(1),st(0) FISUB [mem16/32int] st := st-[mem] odejmowanie odwrotne: FSUBR [mem32/64] st := [mem]-st(0) FSUBR st(0),st(i) st := st(i)-st(0) FSUBR st(i),st(0) st(i) := st(0)-st(i) FSUBRP st(i),st(0) st(i) := st(0)-st(i) i zdejmij FSUBRP (bez argumentów) = FSUBRP st(1),st(0) FISUBR [mem16/32int] st := [mem]-st

mnożenie: FMUL, składnia identyczna jak w odejmowaniu prostym. dzielenie: FDIV, składnia identyczna jak w odejmowaniu prostym. dzielenie odwrotne: FDIVR, składnia identyczna jak w odejmowaniu odwrotnym. wartość bezwzględna: FABS (bez argumentów) zastępuje st(0) jego wartością bezwzględną. zmiana znaku: FCHS: st(0) := -st(0). pierwiastek kwadratowy: FSQRT: st(0) := SQRT[ st(0) ] reszty z dzielenia: FPREM, FPREM1 st(0) := st(0) mod st(1). zaokrąglanie do liczby całkowitej: FRNDINT: st(0) := (int)st(0).

Komendy porównania: FCOM st(n)/[mem] - porównaj st(0) z st(n) (lub zmienną w pamięci) bez zdejmowania st(0) ze stosu FPU FCOMP st(n)/[mem] - porównaj st(0) z st(n) (lub zmienną w pamięci) i zdejmij st(0) FCOMPP - porównaj st(0) z st(1) i zdejmij oba ze stosu FICOM [mem] - porównaj st(0) ze zmienną całkowitą 16- lub 32-bitową w pamięci FICOMP [mem] - porównaj st(0) ze zmienną całkowitą 16- lub 32-bitową w pamięci, zdejmij st(0) FCOMI st(0), st(n) - porównaj st(0) z st(n) i ustaw flagi procesora, nie tylko FPU FCOMIP st(0), st(n) - porównaj st(0) z st(n) i ustaw flagi procesora, nie tylko FPU, zdejmij st(0)

Instrukcje trygonometryczne: FSIN - st(0) := sinus [st(0)] FCOS - st(0) := kosinus [st(0)] FSINCOS - st(0) := kosinus [st(0)], st(1) := sinus [st(0)] FPTAN - partial tangent = tangens st(0) := tg [st(0)] FPATAN - arcus tangens st(0) := arctg [st(0)] Logarytmiczne, wykładnicze: FYL2X st(1) := st(1)*log2[st(0)] i zdejmij FYL2XPI st(1) := st(1)*log2[ st(0) + 1.0 ] i zdejmij F2XM1 st(0) := 2^[st(0)] - 1

Instrukcje kontrolne: FINIT/FNINIT - inicjalizacja FPU. Litera N po F oznacza, aby nie brać po uwagę potencjalnych niezałatwionych wyjątków. FLDCW, FSTCW/FNSTCW - Load/Store control word - zapisuje 16 kontrolnych bitów do pamięci, gdzie można je zmieniać na przykład aby zmienić sposób zaokrąglania liczb. FSTSW/FNSTSW - zapisz do pamięci (lub rejestru AX) słowo statusu, czyli stan FPU FCLEX/FNCLEX - wyczyść wyjątki FLDENV, FSTENV/FNSTENV - wczytaj/zapisz środowisko (rejestry stanu, kontrolny i kilka innych, bez rejestrów danych). Wymaga 14 albo 28 bajtów pamięci, w zależności od trybu pracy procesora (rzeczywisty - DOS lub chroniony - Windows/Linux). FRSTOR, FSAVE/FNSAVE - jak wyżej, tylko że z rejestrami danych. Wymaga 94 lub 108 bajtów w pamięci, zależnie od trybu procesora. FINCSTP, FDECSTP - zwiększ/zmniejsz wskaźnik stosu - przesuń st(0) na st(7), st(1) na st(0) itd. oraz w drugą stronę, odpowiednio. FFREE - zwolnij podany rejestr danych FNOP - no operation. Nic nie robi, ale zabiera czas. WAIT/FWAIT - czekaj, aż FPU skończy pracę. Używane do synchronizacji z CPU.

;Program ładuje dwie liczby całkowite na stos, odejmuje je i sprawdza, czy wynik jest zerem. section.text org 100h start: ;st1 finit ; inicjalizacja stosu FPU fild word [label1] ;ładowanie pierwszej liczby całkowitej do rejestru st0 fild word [label2] ; ładowanie drugiej liczby całkowitej do rejestru st0, pierwsza jest teraz w fsub st0,st1 ; odjęcie od siebie dwóch liczb całkowitych, wynik w st0 ;można też po prostu fsub ficom word [zero] ;porównanie zawartości st0 z zerem fstsw ax ;zapisanie flag FPU do akumulatora sahf ;przepisanie flag FPU do rejestru flagowego jne niezero mov ah, 9 mov dx, lzero int 21h niezero: mov ax, 4C00h int 21h label1 dw 78 label2 dq 78.0 wynik dw 0 zero dw 0 lzero db 'Wynik jest zerem$'

;Program ładuje dwie liczby na stos, a następnie sprawdza, czy są one sobie równe. section.text org 100h start: ;FPU finit ; inicjalizacja stosu FPU fld qword [label1] ;ładowanie pierwszej liczby do rejestru st0 fld qword [label2] ; ładowanie drugiej liczby do rejestru st0, pierwsza jest teraz w st1 fcomi st0,st1 ; porównanie wartości obu rejestrów i ustawienie flag procesora oraz jnz niezero mov ah, 9 mov dx, zero int 21h niezero: mov int ax, 4C00h 21h label1 dq 3.1415 label2 dq 3.1415 wynik dq 0.0 zero db 'Wynik jest zerem$'

;Program sprawdzający, czy sinus pi jest rowny 0? org 100h start: finit fldpi fsin ftst fstsw ax sahf mov ah,9 je jest_zero mov dx,nie_zero jmp short pisz jest_zero: mov dx,zero pisz: int 21h ; inicjalizacja stosu ; ładowanie pi do st0 ; obliczenie sinusa z st0 i zapisanie wyniku w st0 ; porównanie wartości w st0 z zerem ; zapisanie flag z FPU do akumulatora ; przepisanie flag z FPU do EFLAGS mov ax,4c00h int 21h nie_zero db "To nie jest zero :/$" zero db "To jest zero!$"

Zadanie: Napisać program, który mnoży przez siebie dwie liczby i sprawdza, czy wynik jest dodatni, czy ujemny.

Zadanie: Napisać program, który pobierze z klawiatury liczbę rzeczywistą, a następnie odejmie od niej pi i wynik zwróci na ekran. Należy połączyć kod c i asemblera.