Oba narzędzia tłumaczą instrukcje montażu bezpośrednio na kod maszynowy, ale czy możliwe jest określenie, który z nich tworzy najszybszy i najczystszy kod?gas vs. nasm: który asembler wytwarza najlepszy kod?
Odpowiedz
Kiedy piszesz w asembler, dokładnie opisujesz instrukcje generowania, więc nie zależy to od asemblera. To zależy od Ciebie. Istnieje powiązanie jeden-do-jednego między mnemonikami, które piszesz, a rzeczywistymi instrukcjami w kodzie maszynowym.
To jest ... nie optymalizuje kodu. To po prostu tłumaczy jak jest. Tak więc najszybszy i najczystszy kod jest produkowany przez programistę lub kompilator
Dobrze! Asembler jest także kompilatorem, prawda? Czy można zapisać tu i tam cykl CPU? to była moja wątpliwość ... –
asembler nie jest kompilatorem. Kompilator zazwyczaj opiera się na asembler. Asembler tłumaczy zestaw na binarny kod operacji. – tsturzl
Oczywiście nasm, ponieważ składnia Intela wygląda dużo czystiej niż składnia AT &.
Tak, czysty "wygląd" również uważam za plus. –
Szczerze preferuję składnię AT & T. Myślę, że przenosi on cel kodu na bardziej przejrzysty i wygląda mniej zagracony. Tylko szkoda, że tam jest tak mało dokumentacji. – kmm
+1 Do polecania składni Intel przez AT & T. Znajomi nie pozwalają znajomi używać AT & T. – Jason
@Brian: to nie było pytanie ...
@ cyber98834: Cóż, asembler robi to, co musi zrobić każdy monter: przetłumaczyć każdą dyspozycję do jej kodu maszynowego.
Nie ma optymalizacji.
O, a także, nie ma czegoś takiego jak "najszybszy kod" ... Czy mogę zadać ci pytanie? Prędkość procesora jest statyczna, prawda?
Nie można więc przyspieszyć kodu, ponieważ nie można zmienić prędkości procesora.
Ale można zmniejszyć kod tak, aby procesor obsługiwał mniejszą liczbę instrukcji, a więc zajmuje mniej czasu.
Mam nadzieję, że rozumiesz, co próbuję powiedzieć.
Proponuję kupić (lub poszukać niektórych plików PDF, ale nie wiem, czy to jest legalne) Michael Abrash's Graphics Programming Black Book, która obejmuje wiele lekcji optymalizacji.
Witaj SBouazza! Rozumiem twój punkt widzenia. Dzięki! Mam już gotową grafikę do Czarnej Książki Michaela Abrasha (http://www.gamedev.net/reference/articles/article1698.asp) na później :) –
nie wiem na temat tych dwóch konkretnych narzędzi, ale istnieją pewne wskazówki, które mogą być zakodowane różnie:
ADD AX,1
jest albo05 01
lub81 c0 01
lubfe c0
INT 3
jest albocc
lubcd 03
- Nowe instrukcje AVX rozszerzające dwubajtowe instrukcje SSE będą miały prefiks 2-bajtowy lub 3-bajtowy. Wszystkie przedrostki 2-bajtowe mogą być również kodowane jako przedrostki 3-bajtowe.
To tylko kilka przykładów z mojej głowy, w jaki sposób asemblery mogą kodować te same instrukcje w inny sposób, więc pytanie ma sens.
Większość asemblerów zazwyczaj wybiera instrukcję z minimalnym rozmiarem i może dostarczyć wskazówek, które pozwolą Ci wybrać konkretnie ten, który chcesz wygenerować. Na przykład 'cc' i' cd 03' to dwie różne instrukcje z perspektywy procesora. Całkowicie w imieniu asemblera jest to, aby nie zapewniać sposobu generowania instrukcji. –
Zgadzam się, że dobry asembler * powinien * to zrobić. Po prostu wskazuję sposoby, w jakie asembler może zrobić coś innego. Na przykład "INC AX" zakodowany jako "fe c0" jest dokładnie taki sam jak "ADD AX, 1" zakodowany jako "05 01", jeśli chodzi o funkcjonalność i długość instrukcji, chociaż są one faktycznie dekodowane oddzielnie w CPU. –
Tego właśnie szukałem z moim pytaniem. Zaczynam się uczyć montażu x86 (czytałem w podręczniku Intela) i chcę używać do tego narzędzi Linuksa, ale nie miałem pewności, od którego narzędzia zacząć. Ponieważ wydaje się, że nie ma żadnej różnicy między gazem a nasm, odezwę się do nas z powodu bardziej przyjaznego sintax. Dzięki za pomoc! –
Jako słówka na temat składni materii. Można mieć pracę GAS perfekcyjnie ze składni Intel umieszczając następujący wiersz na początku pliku źródłowego:
.intel_syntax noprefix
używam składni Intel zbyt dla wszystkich moich potrzeb assmebly. Wydaje się to dużo bardziej naturalne niż składnia AT &. I zapisuje niektóre naciśnięcia klawiszy :-).
_Ostatnia_ Gaz. Jeśli korzystasz z OS/2, możesz mieć pecha :) –
- 1. Generator liczb losowych, który wytwarza dystrybucję energii?
- 2. 64-bitowy asembler Windows
- 3. Zwykły kod C++ 10 razy szybszy niż wbudowany asembler. Czemu?
- 4. Jak skompilować przy użyciu nasm na MacOSX
- 5. Czy kompilator ma również asembler?
- 6. ASM: MASM, NASM, FASM?
- 7. Kod testowania jednostki, który wywołuje funkcję VirtualPathUtility.ToAbsolute
- 8. Składnik programu CBM Studio Asembler
- 9. kod Skraca który obsługuje IO
- 10. ListFragment vs ListActivity - Który użyć?
- 11. Kod VS otwarte ostatnie pliki
- 12. Dlaczego EF5 wytwarza te skoki w czasach SaveChanges()?
- 13. Montaż/Łączenie problem z NASM i ld
- 14. Jak ustawić mieszany łańcuch narzędzi C/Z80-asembler w kodzie Visual Studio Kod
- 15. Jak wyświetlić kod (nie wyprowadzać), który generuje .Net T4?
- 16. Jak utworzyć lub zmodyfikować asembler GPU?
- 17. Różnica między Podnieś Próbę i Asembler
- 18. canvas vs. webGL vs. CSS 3d -> który wybrać?
- 19. Kod VS + Debugger dla Chrome node.js
- 20. Jak testujesz kod, który tworzy plik IO?
- 21. Jak testować kod, który obwodów forever
- 22. IME z Androidem, który akceptuje kod Unicode
- 23. Jak zachować kod, który NIE DZIAŁA?
- 24. Który kod Java można przenieść na GPU?
- 25. Jak uruchomić kod, który napisałem w JavaScript?
- 26. Dlaczego% b wytwarza SIGFPE, gdy b wynosi zero?
- 27. NASM - Get liczbę elementów w stosie
- 28. wyjątkowy zmiennoprzecinkowy po podzieleniu na x86 NASM
- 29. Różnica między "sekcją" a "segmentem" w NASM
- 30. Kod VS i zadania z węzłem
Technicznie to nie jest do końca prawdą; w przypadku takich trybów adresowania może istnieć więcej niż jeden sposób kodowania w tej samej lokalizacji. Są inne izomorfizmy, o których zapomniałem; Asembler x86 shareware z powrotem w ciągu dnia wykorzystywał te izomorfizmy do kodu "odcisku palca", który został połączony z nim, aby łapać kody. –
Rozumiem, co mówisz. Mogą istnieć różne instrukcje kodu maszynowego o podobnym działaniu. Technicznie, asembler może dostarczyć dwóch różnych reprezentacji dla tych instrukcji ('int3' i' int 3') lub użyć wskazówek, aby wybrać, który z nich wygenerować. Te rzeczy są zwykle dokumentowane dla każdego asemblera. Sądzę, że dla celów tego pytania rozsądnie jest zignorować te kwestie, ponieważ teoretycznie, ** są to naprawdę różne instrukcje **, a asembler może pozwolić ci wybrać jedno z nich. –
Nawet w asemblerze jest miejsce na optymalizację. Wiele architektur umożliwia krótkie tryby adresowania, na przykład użycie wartości bajtowej dla względnego przemieszczenia zamiast długiego. Ponieważ te optymalizacje zmieniają rozmiar kodu obiektowego, niektóre przesunięcia mogą być używane w krótkiej formie, więc wymagana jest optymalizacja wieloprzebiegowa. AFAIK może to zrobić. – hirschhornsalz