No ACL setup yet! Denying access to everyone.
pl:edu:zmitac:n1z:ja:lab1
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| pl:edu:zmitac:n1z:ja:lab1 [2021/03/12 17:40] – [Praktyka: Zadanie do wykonania] pczekalski | pl:edu:zmitac:n1z:ja:lab1 [2022/04/23 19:04] (current) – [Powtórka z teorii: Funkcje i ich wywoływanie z poziomu assemblera] pczekalski | ||
|---|---|---|---|
| Line 37: | Line 37: | ||
| < | < | ||
| </ | </ | ||
| + | |||
| + | === Dodatek AsmDude do VS 2019 === | ||
| + | Visual Studio natywnie nie posiada narzędzi wspomagających pracę dewelopera z kodem źródłowym w assemblerze. Jednak ze względu na istniejących mechanizm dodatków, można doinstalować zewnętrzne narzędzia. Nie jest to obowiązkowe, | ||
| + | Opis dodatku znajduje się na stronie autora((https:// | ||
| ==== Wymagania ==== | ==== Wymagania ==== | ||
| Line 106: | Line 110: | ||
| == Zwrot wartości z funkcji == | == Zwrot wartości z funkcji == | ||
| - | Wartość całkowita (w tym wskaźnik) zwracana jest w rejestrze | + | Wartość całkowita (w tym wskaźnik) zwracana jest w rejestrze |
| Wartości zmiennoprzecinkowa zwracana jest w rejestrze XMM0. | Wartości zmiennoprzecinkowa zwracana jest w rejestrze XMM0. | ||
| + | == Rejestry " | ||
| + | <note warning> | ||
| + | |||
| + | Rejestry, które można bezkarnie zmieniać wewnątrz kodu assemblerowej funkcji, bez konieczności przywracania oryginalnej wartości, to ([[https:// | ||
| + | * RAX, RCX, RDX, R8, R9, R10, R11, oraz XMM0-XMM5, | ||
| + | * dodatkowo w procesorach, | ||
| + | * a ponadto w procesorach wyposażonych w funkcje AVX512VL, wszystkie rejestry ZMM, YMM oraz XMM16-XMM31. | ||
| + | Rejestry, których nie wolno zmieniać (albo raczej należy przywrócić ich oryginalne wartości przed opuszczeniem funkcji) to: | ||
| + | * RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15 oraz XMM6-XMM15. | ||
| ==== Praktyka: Tworzenie projektu C++ i konsersja do ASM ==== | ==== Praktyka: Tworzenie projektu C++ i konsersja do ASM ==== | ||
| Line 171: | Line 184: | ||
| </ | </ | ||
| + | === Oznaczenie pliku ASM do kompilacji === | ||
| + | W niektórych przypadkach zdarza się, że plik '' | ||
| + | <figure jalabstep6> | ||
| + | {{: | ||
| + | < | ||
| + | </ | ||
| + | === Instalacja dodatku kolorującego kod źródłowy w assemblerze === | ||
| + | Na sieci jest dostępne rozszerzenie do Visual Studio o nazwie **AsmDude**, | ||
| ==== Praktyka: Zadanie do wykonania ==== | ==== Praktyka: Zadanie do wykonania ==== | ||
| Zaimplementuj odczyt daty (użyj funkcji '' | Zaimplementuj odczyt daty (użyj funkcji '' | ||
| Line 192: | Line 213: | ||
| Przykładowy segment danych, który był używany w prezentacji wygląda tak:\\ | Przykładowy segment danych, który był używany w prezentacji wygląda tak:\\ | ||
| < | < | ||
| + | ... | ||
| + | |||
| .data | .data | ||
| STD_INPUT_HANDLE = -10 | STD_INPUT_HANDLE = -10 | ||
| Line 205: | Line 228: | ||
| text_msg db "A to jest bardzo dlugi tekst do wyswietlenia w konsoli, ale bez polskich znakow!", | text_msg db "A to jest bardzo dlugi tekst do wyswietlenia w konsoli, ale bez polskich znakow!", | ||
| dummy dq 0 | dummy dq 0 | ||
| + | |||
| + | ... | ||
| </ | </ | ||
| Line 211: | Line 236: | ||
| W tym celu trzeba użyć dyrektywy '' | W tym celu trzeba użyć dyrektywy '' | ||
| < | < | ||
| + | |||
| + | ... | ||
| + | |||
| includelib | includelib | ||
| Line 219: | Line 247: | ||
| EXTERN GetStdHandle: | EXTERN GetStdHandle: | ||
| EXTERN GetSystemTime: | EXTERN GetSystemTime: | ||
| + | |||
| + | ... | ||
| + | |||
| </ | </ | ||
| Zwyczajowo umieszczamy również informację o bibliotece. | Zwyczajowo umieszczamy również informację o bibliotece. | ||
| Line 225: | Line 256: | ||
| Po uruchomieniu programu musimy zachować wartości pewnych rejestrów, w celu ich późniejszego przywrócenia. Na sam koniec należy również wywołać funkcję kończącą program i zwracającą tzw kod powrotu do systemu operacyjnego.\\ | Po uruchomieniu programu musimy zachować wartości pewnych rejestrów, w celu ich późniejszego przywrócenia. Na sam koniec należy również wywołać funkcję kończącą program i zwracającą tzw kod powrotu do systemu operacyjnego.\\ | ||
| - | Minimalny zestaw instrukcji wygląda następująco: | + | Minimalny zestaw instrukcji wygląda następująco: |
| + | < | ||
| + | ... | ||
| .code | .code | ||
| hello_world_asm PROC | hello_world_asm PROC | ||
| Line 265: | Line 298: | ||
| Aby odczytać uchwyt do wnętrza terminala, należy skorzystać z innej funkcji: | Aby odczytać uchwyt do wnętrza terminala, należy skorzystać z innej funkcji: | ||
| < | < | ||
| + | ... | ||
| mov rcx, STD_OUTPUT_HANDLE | mov rcx, STD_OUTPUT_HANDLE | ||
| call GetStdHandle | call GetStdHandle | ||
| mov stdHandle, rax | mov stdHandle, rax | ||
| + | ... | ||
| </ | </ | ||
| Przy czym ta funkcja wymaga jednego argumentu, o który strumień danych nam chodzi. Są trzy możliwości: | Przy czym ta funkcja wymaga jednego argumentu, o który strumień danych nam chodzi. Są trzy możliwości: | ||
| Line 290: | Line 325: | ||
| </ | </ | ||
| - | W celu wyświetlenia okienka dialogowego, | + | W celu wyświetlenia okienka dialogowego, |
| < | < | ||
| + | ... | ||
| ; WINUSERAPI int WINAPI MessageBoxA( | ; WINUSERAPI int WINAPI MessageBoxA( | ||
| ; RCX => _In_opt_ HWND hWnd, | ; RCX => _In_opt_ HWND hWnd, | ||
| Line 301: | Line 337: | ||
| mov r8, offset info_msg | mov r8, offset info_msg | ||
| mov r9, 0 ; MB_OK | mov r9, 0 ; MB_OK | ||
| - | and rsp, not 8 ; align stack to 16 bytes prior to API call | + | and rsp, not 8 |
| call MessageBoxA | call MessageBoxA | ||
| - | </code< | + | ... |
| + | </code> | ||
| - | <note important> | + | <note important> |
| ==== Debuggowanie i uruchamianie ==== | ==== Debuggowanie i uruchamianie ==== | ||
| Uwagi praktycznie odnośnie debbugowania i podglądania pamięci: | Uwagi praktycznie odnośnie debbugowania i podglądania pamięci: | ||
pl/edu/zmitac/n1z/ja/lab1.1615567228.txt.gz · Last modified: by pczekalski
