Dlaczego istnieje różnica między językami assembly, takimi jak Windows, Linux?

Jestem stosunkowo nowy w tych wszystkich niskopoziomowych rzeczach, języku montażu.. i chcesz dowiedzieć się więcej szczegółów. Dlaczego istnieje różnica między językami Linux, Windows Assembly?

Jak rozumiem, kiedy kompiluję kod C System Operacyjny nie produkuje tak naprawdę czystego kodu maszynowego lub montażowego, produkuje zależny od systemu operacyjnego kod binarny.Ale dlaczego ?

Na przykład, gdy używam systemu x86, CPU rozumie tylko x86 ASM am I right?.So dlaczego nie piszemy czystego kodu montażowego x86 i dlaczego są różne warianty montażu oparte na systemie operacyjnym? Gdybyśmy pisali pure ASM lub OS produce pure ASM nie byłoby problemów z kompatybilnością binarną między systemami operacyjnymi, czy nie ?

Naprawdę zastanawiam się wszystkie powody za nimi. Każda szczegółowa odpowiedź, artykuł, książka byłaby świetna. Dzięki.

Author: mcaaltuntas, 2011-01-05

9 answers

Nie ma różnicy. Kod złożenia jest taki sam, Jeśli procesor jest taki sam. kod x86 skompilowany w systemie Windows jest binarny zgodny z kodem x86 w systemie Linux. Kompilator nie tworzy kodu binarnego zależnego od systemu operacyjnego, ale może spakować kod w innym formacie(np. PE vs. ELF).

Różnica polega na tym, w jakich bibliotekach są używane. Aby korzystać z systemu operacyjnego (na przykład we/wy), musisz połączyć się z bibliotekami systemu operacyjnego. Nic dziwnego, że biblioteki systemu Windows nie są dostępne na komputerze z Linuksem (chyba że masz oczywiście Wine) i odwrotnie.

 16
Author: OrangeDog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 14:51:06

Oprócz innych odpowiedzi.

OS dyktuje swój Application Binary Interface (ABI), który zawiera format obiektów wykonywalnych. Jest to format wykonywalny i Linkowalny (ELF) dla Linuksa (i wielu innych systemów uniksopodobnych) oraz Portable Executable (PE) Dla Windows. Zobacz tę tabelę dla innych formatów.

 5
Author: Nikolai Fetissov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 14:57:04

Cóż, nie biegasz prosto. Kod musi być w jakimś formacie wykonywalnym: windows używa PE, większość Unices używa teraz ELF (chociaż były inne, np.. out).

Podstawowe instrukcje montażu są takie same, a funkcje, które tworzysz za ich pomocą, są takie same.

Problem wiąże się z dostępem do innych zasobów. Procesor jest naprawdę dobry w obliczeniach, ale nie może uzyskać dostępu do dysku twardego, wydrukować znak na ekranie lub połączyć się z Bluetooth telefon. Elementy te są zawsze w jakiś sposób zależne od systemu operacyjnego. Są one realizowane w kategoriach syscalls, gdzie procesor sygnalizuje systemowi operacyjnemu wykonanie określonego zadania. Zadanie numer 17 w Linuksie niekoniecznie jest zadaniem 17 w systemie windows; może nawet nie mieć odpowiedników.

Ponieważ większość bibliotek ma pewne syscalle na najniższym poziomie, dlatego kod nie może być po prostu przekompilowany w każdym przypadku.

 4
Author: Michael Lowman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 14:55:08

Jeśli nie używasz wbudowanego środowiska programistycznego systemu, kompilujesz za pomocą kompilatorów, które są skierowane do określonego środowiska uruchomieniowego. Ten runtime definiuje konwencje do użycia sprzętu: przekazywanie argumentów, obsługa wyjątków, itd. Konwencje te współdziałają z systemem operacyjnym lub przynajmniej z dostępnymi bibliotekami uruchomieniowymi, z którymi program musi się połączyć.

 3
Author: bmargulies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 14:52:11

Historycznie Linux Assembler ma tendencję do wykonywania składni AT&T, ponieważ jest to wspierane przez GNU Assembler . Podobnie asemblery Windows mają tendencję do używania składni Intela, jak w przypadku MASM i NASM.

Wszystkie asemblery x86 wytwarzają to samo wyjście-czyli kod maszynowy x86. I moĹźna uĹźyÄ ‡ NASM lub GNU Assembler na Linuksie do programowania w skĹ 'adni Intela, a GNU Assembler na Windows do programowania w skĹ' adni AT&T.

 3
Author: Tim Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 15:23:14

System operacyjny określa dwie rzeczy: (1) konwencja wywołania, która określa sposób działania parametrów na stosie i tym samym wpływa na kod złożenia, oraz (2) biblioteki czasu pracy, które implementują typowe funkcje, takie jak alokacja pamięci, wejście/wyjście, matematyka wyższego poziomu itp.

Podczas kompilacji x+y do tego samego kodu asemblera pod Windows lub Linuksem na procesorze x86, y = sin(x) będzie różny ze względu na inną konwencję wywoływania i inną bibliotekę matematyczną.

Beyond że sam język asemblacji jest zależny od procesora. x86, x86_64, ARM, PowerPC, każdy ma swój własny język montażu.

 1
Author: mtrw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 14:54:15

Nie ma różnicy w językach asemblerów (chociaż mogą występować różnice między asemblerami, a co za tym idzie używanymi notacjami), pod warunkiem, że trzymamy się x86. Zarówno Linux, jak i Microsoft Windows działają na innych architekturach, tym bardziej w przypadku Linuksa.

Jednak obecnie system operacyjny nie tylko ładuje program do pamięci i odpuszcza. Zapewnia dużą ilość usług. Ponieważ chroni również programy przed sobą, nakłada ograniczenia. Do zrobienia Wszystko inne niż podstawowe obliczenia, zwykle konieczne jest przejście przez system operacyjny. (Mniej było to w przypadku starszych systemów operacyjnych, takich jak MS-DOS i CP / M, które mogły ładować programy, które działały niezależnie, ale obecnie prawie każdy system nie Wbudowany ma nowoczesny system operacyjny.)

Programy nie są również przechowywane jako zwykłe binarne obiekty BLOB. Zwykle konieczne jest połączenie z innymi bibliotekami, często ponieważ program jest ładowany do wykonania (tak na przykład działają biblioteki DLL), i to jest konieczne, aby połączyć się z systemem operacyjnym. Mogą istnieć inne informacje wymagane przez system operacyjny, a zatem muszą istnieć jakieś informacje o binarnym obiekcie blob w pliku wykonywalnym. To różni się w zależności od systemu operacyjnego.

Dlatego pliki wykonywalne muszą być w formacie do załadowania do pamięci, a to różni się w zależności od systemu operacyjnego. Aby zrobić coś użytecznego, muszą wykonywać połączenia z systemem operacyjnym, które różnią się między systemami. Dlatego nie można pobrać pliku wykonywalnego Windows i powiązanych bibliotek oraz uruchom go na Linuksie.

 1
Author: David Thornley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 15:02:46

Istnieje kilka asemblerów dla różnych platform, które, biorąc pod uwagę plik źródłowy, będą produkować wyjściowy plik binarny bezpośrednio, który jest przeznaczony do ładowania pod określonym adresem. Takie asemblery były popularne dla niektórych małych mikrokontrolerów, lub dla niektórych historycznych procesorów, takich jak 6502 i Z80. Podczas montowania programu konieczne byĹ 'oby poznanie adresu, w ktĂłrym powinien on znajdowaÄ ‡ siÄ™; uĺźycie innego adresu wymagaĹ' oby ponownego montowania programu. Na z drugiej strony montaż w takim systemie był procesem jednostopniowym. Uruchom asembler na kodzie źródłowym i uzyskaj wyjście wykonywalne. W niektĂłrych przypadkach moĹźna byĹ 'oby mieÄ ‡ kod ĹşrĂłdĹ' owy, asembler i wyjĹ "cie w pamiÄ ™ ci na raz (na moim Commodore 64 uĺźywaĺ' em assemblera, ktĂłry zostaĹ 'opublikowany w magazynie Compute' s Gazette, ktĂłry dziaĹ ' aĹ ' w ten sposĂłb).

Chociaż ponowne złożenie wszystkiego za każdym razem, gdy jego zmiany adresu mogłyby być praktyczne dla programu, który " przejmie w wielu przypadkach pożądane jest użycie wieloetapowego procesu, w którym pliki źródłowe są przetwarzane na pliki kodu obiektowego, które zawierają zmontowane instrukcje, ale także zawierają różnego rodzaju "symboliczne" informacje o nich; pliki te są następnie przetwarzane na różne sposoby, aby albo uzyskać obraz pamięci, który może być załadowany bezpośrednio do pamięci, albo połączony plik obiektowy, który może być przenoszony przez program ładujący system operacyjny będzie wiedział, jak dostosować go do dowolnego adresu, pod którym może być załadowany.

Aby system linkowania obiektów był użyteczny, musi pozwolić na odroczenie pewnych rodzajów obliczeń adresów do czasu połączenia lub załadowania programu. Niektóre systemy pozwalają tylko na bardzo proste obliczenia wykonywane w czasie łącza / ładowania, podczas gdy inne pozwalają na bardziej skomplikowane obliczenia. Prostsze systemy mogą być bardziej wydajne, gdy są wykonalne, ale ich ograniczenia mogą wymusić obejścia. Jako przykład, rutyna, która będzie używać BX do pętli przez struktura danych o wielkości mniejszej niż 256 bajtów może być zapisana w następujący sposób:

    mov bx,StartAddr

: mov al, [bx] ... zrób trochę obliczeń inc bx CMP bl,

Byłoby możliwe użycie cmp bx,(StartAddr+Length), ale jeśli narzędzia kompilacji mogą go obsługiwać, porównywanie tylko niskiego bajtu byłoby szybsze. Z drugiej strony, niektóre rodzaje 16-bitowych narzędzi do montażu/łączenia mogą wymagać wykonania wszystkich poprawek adresowych z 16-bitowymi adresami zapisanymi w kodzie.

Ponieważ różne systemy pozwalają na różne funkcje w swoich formatach kodu obiektowego, wymagają one różnych funkcji w swoich językach montażu, aby je kontrolować. Zestawy instrukcji mogą być określone przez producenta chipów, ale funkcje do wyrażania relokowalnych obliczeń adresowych na ogół nie są.

 0
Author: supercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-04 19:38:23

Język asemblera jest związany z architekturą procesora nie z O. S., ale O. S. mają szereg funkcji systemowych skompilowanych w postaci binarnej, które program assemblera może wywołać przez wywołanie przerwania. Na przykład standardowe wyjście wejściowe, operacja ecc....

 0
Author: Domii E Antoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-28 18:06:22