No ACL setup yet! Denying access to everyone.
pl:edu:zmitac:n1z:ja:lab4

This is an old revision of the document!


Ćwiczenie 3: Integracja kodu niezarządzalnego, tworzonego w języku Assembler wraz z aplikacją typu WPF w .NET C#, instrukcje SIMD

Środowisko sprzętowe i programistyczne

Do wykonania ćwiczenia niezbędny jest komputer PC w postaci maszyny fizycznej lub wirtualnej z systemem Windows 7, 8, 8.1 lub 10, z zainstalowanym i skonfigurowanym środowiskiem programistycznym Microsoft Visual Studio 2019 Community Edition1).

Proszę nie pomylić z Visual Studio Code, to zupełnie inny produkt, który nie nadaje się wprost do wykorzystania w naszym laboratorium do realizacji zadań.
Szczegóły instalacji i konfiguracji środowiska przedstawiono w ramach Laboratorium 1 i 2.

Wymagania

Studenci muszą rozumieć sposób tworzenia i działania aplikacji typu “Command Line”, podstawy języka assembler oraz podstawy języka C#.

Wstęp

W czasie zajęć laboratoryjnych skorzystamy z modelu WPF, przy czym będziemy wykorzystywać bezpośrednie akcje (Eventy), a nie bindowanie zmiennych (Bindings) w celu ułatwienia analizy kodu. GUI będzie prostym oknem dialogowym, które będzie zawierało zestaw kontrolek służących do pobierania i wyświetlania wartości (pola typu TextBox) oraz przycisków wywołujących akcje (Button).

W ramach zajęć nie będziemy tworzyli żadnych elementów walidujących wprowadzane przez użytkownika dane, w związku z tym w przypadku wpisania łańcucha znaków, którego np. nie można poprawnie skonwertować do wartości numerycznej, program po prostu zgłosi wyjątek. Należy o tym pamiętać podczas testowania, w szczególności istotnym elementem jest znak reprezentujący separator wartości dziesiętnej dla liczb zmiennoprzecinkowych, który jest zależny od języka interfejsu użytkownika w systemie Windows.

Konfiguracja projektu

W ramach niniejszego laboratorium użyjemy projektu analogicznego do projektu w laboratorium nr 3, przy czym zamiast aplikacji konsolowej w języku C# zostanie wykorzystany frontend w modelu WPF (aplikacja okienkowa).

WPF

Windows Presentation Fundation (WPF) to w skrócie sposób tworzenia interfejsów użytkownika dla systemu Windows z wykorzystaniem środowiska .NET (C#, F#, VB.NET). WPF zastępuje poprzednie Windows Forms, związane z kodem niezarządzalnym i językiem C++. WPF cechuje się tym, że widok (layout, okienka i układ kontrolek) jest odseparowany od kodu zarządzającego zawartością i interakcją. Wygląd jest zapisany w postaci osobnych plików z rozszerzeniem .xaml, a kod reprezentujący okienko jest w dużej mierze generowany “w locie” podczas edycji wyglądu w edytorze Visual Studio (tzw “Code Behind”). Odseparowanie wyglądu od kodu pozwala na tworzenie modyfikacji wyglądu przez grafików, bez udziału programistów (tworzenie tzw. skórek). Dla każdego widoku (okienka) są zatem tworzone co najmniej dwa pliki: jeden z kodem, drugi z plikiem XML (.xaml) reprezentującym położenie i cechy graficzne. WPF jest skalowalny i posiada możliwość tworzenia inerfejsów użytkownika, które automatycznie dostosowują się do proporcji i rozmiarów ekranu oraz ich rozdzielczości i wymiarów (DPI). Więcej informacji można znaleźć w oficjalnym portalu Microsoft2) lub na wielu innych stronach. WPF na dzień dzisiejszy jest wiodącym środowiskiem tworzenia aplikacji okienkowych dla Windows w środowisku .NET.

Tworzenie projektu WPF

W Visual Studio należy utworzyć projekt typu WPF Desktop w języku C# (rysnuek 1):

Fig. 1: Tworzenie projektu WPF

Na etapie pytania o wersję frameworku można wybrać dowolny powyżej 3.0, może to być np. 5.0 lub 4.x (o ile został zainstalowany).
Po stworzeniu projektu pojawi się okienko graficznego projektowania interfejsu użytkownika wraz ze skojarzonym plikiem .xaml. Dane w pliku opisują wygląd okienka, a zatem interakcja po stronie okienka (np. dołożenie kontrolek) powoduje automatyczną modyfikację treści pliku .xaml. Zależność ta jest prawdziwa również w drugim kierunku, czyli ręczne wpisanie tekstu do pliku .xmal spowoduje zmianę wyglądu interfejsu użytkownika. \\Główne okienko aplikacji automatycznie otrzymuje nazwę MainWindow, a zatem związany z nim plik opisujący będzie miał oznaczenie MainWindow.xaml, a kod w języku C# (tzw. Code Behind) odpowiednio MainWindow.xaml.cs.

Podczas projektowania, nowe elementy najłatwiej dodać, przeciągając je z menu [Toolbox].
Na potrzeby naszej aplikacji wystarczą typy TextBox (nie pomylić z TextBlock!) oraz Button.

Przykładowy interface użytkownika, który będzie odpowiedni na potrzeby niniejszego projektu zaprezentowano na rysunku 2. Każdej kontrolce, do której będzie bezpośrednio odwoływać się kod (tutaj pola typu TextBox) należy nadać unikalną nazwę. Nadawanie nazw odbywa się w okienku właściwości ([Properties]) obiektu, które na rysunku 2 domyślnie znajduje się w prawym dolnym rogu interfejsu użytkownika Visual Studio. Wprowadzenie nazwy ma automatycznie swoje odzwierciedlenie w pliku opisowym .xaml.

Fig. 2: Przykładowy interface użytkownika
Uwaga! Okienko właściwości obiektu graficznego działa w dwóch trybach, przełączanych za pomocą przycisków znajdujących się na górze, po prawej stronie okienka: klucz oznacza tryb zmiany właściwości (Properties), a błyskawica tryb zmiany akcji (Events). Na rysunku 2 miejsce to zaznaczono czerwoną strzałką.

W przypadku przycisków, nie jest konieczne nadawanie im nazwy, natomiast konieczne jest utworzenie akcji związanej z kliknięciem przycisku. Akcja ta (Event) zostanie wywołana po kliknięciu danego przycisku. Funkcje przypisane do kolejnych przycisków muszą mieć unikalne nazwy.
Akcję można stworzyć na kilka sposobów:

  • Jednym z nich jest dwukrotne kliknięcie przycisku w edytorze graficznym. Metoda ta nie pozwala jednak na wybranie nazwy funkcji.
  • Przełączenie okienka dialogowego właściwości przycisku w tryb edycji akcji (znaczek błyskawicy, jak na rysunku ref_asm4_4) i wpisanie nazwy funkcji.
  • Ręczna edycja pliku .xaml oraz .xaml.cs - metoda ta nie jest polecana.
Fig. 3: Tworzenie akcji uruchamianej po naciśnięciu przycisku

Przełączenie z widoku projektowania interfejsu do kodu C# (Code Behind) najprościej wykonać używając klawisza [F7]. Ewentualnie mozna go wybrać z drzewa projektu (rysunek 4).

Fig. 4: Code Behind - kod zarządzający akcjami okienka

Zadanie do wykonania

Należy utworzyć prosty kalkulator, który przeliczy wektorowo dla 4 zmiennych wyniki dla operacji dodawania, odejmowania, mnożenia i dzielenia (akcje na osobnych przyciskach). Wymagane jest przeliczenie więcej niż jednego zestawu danych w ramach jednej instrukcji dodawania (trzeba skorzystać z SIMD). Każde zadanie należy wykonać w dwóch wariantach: z nasyceniem i bez nasycenia.

Należy zadeklarować po jednej funkcji assemblerowej dla każdej operacji.

Wartości najwygodniej będzie przekazać do funkcji assemblerowych wpisując je po stronie kodu w C# do dwóch tablic źródłowych, a na wyniki zaalokować tablicę trzecią. Liczba zmiennych jest znana (4) i stała, zatem długości tablic nie trzeba przekazywać do funkcji assemblerowej. Wskaźniki na tablice można przekazać poprzez rejestry lub poprzez wskaźnik na strkturę zawierającą wskaźniki do ww. tablic (do wyboru).

Metoda weryfikacji wyników

Sprawdzenie debuggerem wraz z podglądem rejestrów / stanu pamięci oraz obserwacja wyników i sprawdzenie obliczeń.

Pomocne zasoby

pl/edu/zmitac/n1z/ja/lab4.1618088307.txt.gz · Last modified: by pczekalski