Asembler x86/Narzędzia

Aby móc cokolwiek zrobić z naszą wiedzą nt. języka Asembler, będziemy potrzebować kilku narzędzi, które nam to umożliwią.

Asembler i linker

edytuj

Program tłumaczący kod z języka Asembler na pliki z wykonywalnym kodem nazywamy asemblerem. Obecnie dostępne są:

  • Microsoft Macro Assembler (MASM) firmy Microsoft
  • Turbo Assembler (TASM) firmy Borland
  • Netwide Assembler (NASM)
  • Flat Assembler (FASM)
porównanie poszczególnych asemblerów
MASM TASM NASM FASM
popularność b. duża średnia średnia ostatnio spora
platformy Windows, DOS Windows, DOS Windows, Unix, DOS, MacOS X Windows, Unix, DOS
wer. 64-bitowa tak nie tak tak
aktywność mała brak spora spora
dostępność bezpłatny komercyjny open-source open-source

Pierwsze dwa asemblery są dostępne jedynie w wersjach dla systemu Windows, zaś NASM i FASM są wieloplatformowe. Wszystkie asemblery są niemal identyczne w działaniu. Nie ma tu większego znaczenia coś takiego jak optymalizacja znana z kompilatorów języków wysokiego poziomu. Główne różnice leżą w makroinstrukcjach i dyrektywach, lecz i tutaj można zauważyć wiele podobieństw.

Asembler tworzy pliki .obj, które następnie można połączyć w plik wykonywalny za pomocą linkera. MASM jest udostępniany z własnym linkerem link.exe, TASM z Turbo Linkerem, NASM jest z reguły używany w połączeniu z programem GNU Linker lub ALINK, zaś FASM posiada wbudowany linker.

Wybierz jeden z powyższych asemblerów i omijaj rozdziały, które go nie dotyczą (rozdziały, w których składnie asemblerów różnią się, są w kilku kopiach, po jednej dla każdego asemblera).

Debuger

edytuj

Debugery mają za zadanie pomóc programiście w odnalezieniu błędów w programie. Większość debugerów pozwala dodatkowo na wstawianie w kodzie tzw. punktów wstrzymania, gdzie to debugger wstrzymuje działanie programu do czasu, dopóki nie dostanie odpowiedniej komendy od programisty. Debugery dodatkowo pozwalają na odczytanie wartości rejestrów procesora, czy wartości poszczególnych zmiennych. Obecnie najpopularniejszy debuger to GDB(GNU Project debugger), jednak do prostych zastosowań wystarczą również proste debugery, dostarczane wraz z asemblerami. Wielu programistów uważa je za zupełnie opcjonalne narzędzie, jednak większość starszych doświadczonych programistów jest ich fanatycznymi zwolennikami i tępi tę pierwszą grupę niemal jak heretyków. Ze względu na należne uznanie dla tej drugiej grupy, nie należy traktować tego narzędzia zbyt pobłażliwie.

Disasembler

edytuj

Disasembler to program tłumaczący kod maszynowy na język asemblera. Z reguły proste disasemblery dostarczane są w pakiecie wraz z asemblerami (bardzo dobry disasembler dostarczany jest wraz z asemblerem NASM). Jako, że jest to proces dość złożony, istnieje wiele komercyjnych disasemblerów, z których wg ogólnej opinii najlepszy to IDA Pro Disassembler. Dzięki tej grupie programów możemy wejrzeć w kod cudzych programów, jednak zdeasemblerowany kod znacznie różni się od oryginału, przez co jego interpretacja może być dość trudna. Proces interpretacji tegoż kodu nazywamy mianem inżynierii wstecznej (ang. reverse engineering). Disasemblery są z reguły używane w połączeniu z debugerami (IDA Pro Disassembler jest jednocześnie disasemblerem jak i debugerem).

Zintegrowane środowisko programistyczne (ang. integrated development environment (IDE)) łączy w sobie wszystkie powyższe narzędzia, dodając edytor tekstowy oraz często dodatkowe narzędzia. Większość asemblerów pracuje w trybie konsolowym, więc korzystanie z nich jest niewygodne. IDE robią większość zbędnej pracy za nas. Nie ma wśród nich żadnego faworyta; oto kilka z nich:

Istnieje również możliwość pisania programów asemblerowych w bardzo popularnym, wielojęzykowym środowisku Eclipse z pluginem ASM Plugin.

Do wygodnego tworzenia kodu, nawet przy wykorzystaniu konsolowych kompilatorów, wystarczy dobry edytor tekstowy z możliwością ustawienia kolorowania składni i wywoływania kompilatora bezpośrednio z okna edytora. Jest to wygodne jeżeli często korzysta się z innych języków programowania - wtedy jeden edytor pełni rolę IDE do wielu języków.