2009-08-15 6 views

Odpowiedz

26

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.

+13

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. –

+1

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. –

+4

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

4

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

+1

Dobrze! Asembler jest także kompilatorem, prawda? Czy można zapisać tu i tam cykl CPU? to była moja wątpliwość ... –

+1

asembler nie jest kompilatorem. Kompilator zazwyczaj opiera się na asembler. Asembler tłumaczy zestaw na binarny kod operacji. – tsturzl

2

Oczywiście nasm, ponieważ składnia Intela wygląda dużo czystiej niż składnia AT &.

+0

Tak, czysty "wygląd" również uważam za plus. –

+4

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

+4

+1 Do polecania składni Intel przez AT & T. Znajomi nie pozwalają znajomi używać AT & T. – Jason

1

@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.

+0

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 :) –

7

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 albo 05 01 lub 81 c0 01 lub fe c0
  • INT 3 jest albo cc lub cd 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.

+0

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. –

+0

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. –

+0

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! –

5

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 :-).

+0

_Ostatnia_ Gaz. Jeśli korzystasz z OS/2, możesz mieć pecha :) –

Powiązane problemy