Asembler x86/Łączenie z językami wysokiego poziomu

Język Asembler można łączyć z językami wysokiego poziomu w obu kierunkach. Na początku będziemy to robić w celu uproszczenia kodu pierwszych programów pisanych w języku Asembler poprzez wykorzystanie gotowych bibliotek funkcji języka C takich jak printf() lub scanf(). Pozwoli to ułatwić proces nauki dzięki możliwości skupienia się na istocie zagadnienia bez wnikania w niestotne w danym momencie szczegóły.

Przykład: Istotą zagadnienia może być wykorzystanie koprocesora matematycznego do obliczenia średniej geometrycznej z pięciu wprowadzonych z klawiatury liczb. Nieistotnym szczegółem będzie wówczas konwersja ciągu znaków do binarnego formatu liczby zmiennoprzecinkowej typu float wraz z późniejszym wyświetleniem wyniku w czytelnej dziesiętnej formie.

Może się jednak zdarzyć, że konieczna będzie optymalizacja programów napisanych w językach wysokiego poziomu. Wówczas niektóre krytyczne funkcje języka wysokiego poziomu będziemy chcieć samodzielnie przepisać w Asemblerze zyskując niejednokrotnie wiele taktów procesora w przypadku często wykonywanych funkcji w algorytmach iteracyjnych, bądź w celu efektywniejszego wykorzystania pamięci w przypadku funkcji rekurencyjnych.

Tak napisane moduły napisane w języku Asembler możemy wykorzystać w językach wysokiego poziomu na dwa różne sposoby:

Możemy użyć go bezpośrednio w kodzie źródłowym naszego programu np w C czy C++. Wówczas nie dość, że musimy znać nie tylko sam Asembler, ale także sposoby, w jakie kompilator HLL-a będzie daną wstawkę tłumaczył do postaci binarnej. Wiele kompilatorów ma własne sposoby i schematy na wprowadzanie kodu języka niskiego poziomu, przez co mamy małe utrudnienie w pisaniu programu, ale to się bardzo sprawdza gdy musimy napisać niedużo kodu w Asemblerze i w dodatku chcemy mieć "wszystko na miejscu" w jednym pliku.

Drugi sposób to pisanie naszych rozkazów w osobnym pliku jako zupełnie autonomiczny moduł naszego programu, który będzie asemblowany osobno i następnie już w postaci binarnej łączony ze skompilowanymi modułami języków wysokiego poziomu. Dzięki temu możemy pisać przy pomocy takiego asemblera jakiego chcemy, nie martwiąc się o to jak kompilator sobie poradzi z wstawką gdyż jej po prostu nie będzie. Ma to również tę zaletę, że jeśli zmodyfikujemy tylko kod w Asemblerze, nie musimy kompilować całego programu na nowo. Po prostu nasze zmiany linkujemy z starą wersją modułów programu i proces przebudowy całej aplikacji jest już krótszy.