Czym jest język asemblera?

Czasami nazywany asemblerem lub ASM, asembler jest językiem programowania niskiego poziomu.

Programy napisane w językach asemblerowych są kompilowane przez asembler. Każdy asembler ma swój własny język asemblera, który jest zaprojektowany dla jednej konkretnej architektury komputerowej.

Język maszynowy to po prostu seria liczb, których czytanie ludziom nie jest łatwe. Za pomocą ASM programiści mogą pisać programy czytelne dla człowieka, które odpowiadają prawie dokładnie językowi maszyny.

Wadą jest to, że wszystko, co robi komputer, musi być dokładnie opisane, dokładnie i szczegółowo. Zaletą jest to, że programista ma maksymalną kontrolę nad tym, co robi komputer.

Dlaczego ASM jest językiem „niskiego poziomu”?

Zgromadzenie nazywa się językiem programowania niskiego poziomu, ponieważ istnieje (prawie) relacja jeden do jednego między tym, co mówi komputerowi, a tym, co robi komputer. Ogólnie, jeden wiersz programu asemblera zawiera maksymalnie jedną instrukcję dla komputera.

Czym różni się ASM od języka „wysokiego poziomu”?

Języki wysokiego poziomu zapewniają abstrakcje operacji niskiego poziomu, które pozwalają programiście skupić się bardziej na opisywaniu tego, co chcą robić, a mniej na tym, jak należy to robić . Programowanie w ten sposób jest wygodniejsze i sprawia, że ​​programy są łatwiejsze do odczytania po rezygnacji z kontroli niskiego poziomu.

Programy napisane w językach wysokiego poziomu nigdy nie dorównają surowej szybkości i wydajności programów napisanych w zespole. Przykłady języków wysokiego poziomu to Python, Java, JavaScript, Clojure i Lisp.

Co to jest język „średniozaawansowany”?

Języki średniego lub niższego poziomu zapewniają pewne abstrakcje wysokiego poziomu, aby ułatwić życie programisty, zapewniając jednocześnie dostęp do operacji niskiego poziomu. Są one często używane do pisania systemów operacyjnych, dlatego czasami nazywane są językami programowania systemu .

Programy napisane w językach średniego poziomu mogą działać równie dobrze lub prawie tak dobrze, jak programy napisane w języku asemblerowym. Przykłady języków programowania średniego poziomu to C, C ++, Ada, Nim i Rust.

Czy ASM jest przenośny?

Nie. Ponieważ języki asemblera są powiązane z jedną konkretną architekturą komputera, nie są przenośne. Program napisany w jednym języku asemblera musiałby zostać całkowicie przepisany, aby mógł działać na innym typie maszyny.

Przenośność jest jedną z głównych zalet języków wyższego poziomu. Język programowania C jest często nazywany „przenośnym zestawem”, ponieważ kompilatory C istnieją prawie dla każdej nowoczesnej architektury systemu. Program napisany w C może wymagać pewnych zmian, zanim zostanie skompilowany na innym komputerze, ale język podstawowy jest przenośny.

Mówiąc ogólnie, im wyższy poziom języka, tym mniej zmian trzeba wprowadzić, aby działał na innej architekturze. Języki najniższego poziomu - język maszynowy i język asemblera - nie są przenośne.

Przykład: Witaj, świecie! w zespole 32-bitowym, dla Windows

Oto „Hello, World” napisany dla 32-bitowego procesora Intel. Będzie także działać na 64-bitowym procesorze. Skompilujemy i uruchomimy go na Windows 10.

 global _main extern _printf section .text _main: push message call _printf add esp, 4 ret message: db 'Hello, World!', 10, 0 

Aby rozpocząć, otwórz Notatnik. Skopiuj powyższy kod i wklej go do nowego pliku tekstowego i zapisz plik jako hello.asm .

Aby skompilować zespół, użyjemy NASM, Netwide Assembler. Można go pobrać ze strony http://www.nasm.us/.

 nasm -f win32 hello.asm 

Po uruchomieniu tego polecenia NASM tworzy plik obiektowy. Plik obiektowy zawiera kod maszynowy, ale nie jest całkiem plikiem wykonywalnym. Nasz plik obiektowy nazywa się hello.obj .

Aby utworzyć plik wykonywalny, użyjemy 32-bitowej wersji MinGW (Minimal GNU for Windows), która zapewni kompilator gcc. Można go pobrać ze strony http://www.mingw.org/.

 gcc -o hello.exe hello.obj 
 dzień dobry 
 Witaj świecie! 

Przykład: Witaj, świecie! w zestawie 64-bitowym dla systemu Linux

Oto „Hello, World” napisany dla 64-bitowego procesora Intel. Skompilujemy i uruchomimy go w 64-bitowym systemie Linux.

 extern printf; funkcja C printf, nazywana sekcją .data; Sekcja danych, zmienne inicjowane msg: db "Witaj, świecie!", 0; Łańcuch C kończy się na 0 fmt: db "% s", 10, 0; Format printf, sekcja „n”, „0” .text; Rozpocznij sekcję kodu global main; standardowy punkt wejścia gcc main:; etykieta programu dla punktu wejścia naciśnij rbp; ustawić ramkę stosu, należy wyrównać mov rdi, fmt mov rsi, msg mov rax, 0; może też być: xor rax, rax call printf; Wywołaj funkcję C printf pop rbp; przywróć stos mov rax, 0; normalny, brak błędu, zwracana wartość ret; powrót 

Skopiuj i wklej ten program do nowego pliku o nazwie hello.asm .

Następnie skompiluj zestaw z NASM, który możesz zainstalować za pomocą menedżera pakietów. Na przykład w Ubuntu lub Debianie możesz zainstalować NASM przy użyciu apt:

 sudo apt update && sudo apt install nasm 

Uruchom to polecenie, aby utworzyć plik obiektu:

 nasm -f elf64 hello.asm 

Plik obiektowy ma nazwę hello.o .

Następnie użyj gcc, aby połączyć ten plik obiektowy z niezbędnymi bibliotekami na komputerze i skompiluj go do pliku wykonywalnego o nazwie hello :

 gcc hello.o -o witaj 

Na koniec uruchom plik wykonywalny:

 ./dzień dobry 
 Witaj świecie! 

Dla odniesienia jest to ten sam program napisany w C:

 #include int main () {char msg [] = "Hello world n"; printf ("% s n", msg); powrót 0; } 

  • Zobacz procedury debugowania dla innych przykładów kodu zespołu niskiego poziomu i dodatkowe informacje o tym, co robi każda procedura.
  • Dodatkowe przykłady języka asemblera można znaleźć na stronie Happy Codings.

2GL, asembler, język niskiego poziomu, język maszynowy, terminy programowania