Co dokładnie robi opcode ORG?

0

Jest sobie opcode org który robi "coś".
W binarkach com jest fetysz stawiania org 100h na początku, co jak sobie podpatrzyłem w nasmie przed chwilą, nie jest nawet wstawiane do binarki. Google milczy ogłupiałe wieloznacznością słówka org więc tak siedzę i dumam, co to w sumie robi?

Powiedziane jest że org jest informacją gdzie do pamięci powinien zostać wczytany kod binarki, i że niby w starych mikroprocesorach dało się podpiąć łatwo kod pod przerwanie używając org'a.

No i tak siedzę i patrzę się na tego orga i nie mam pojęcia do czego ten ogr w końcu służy.

Wie ktoś do czego to to w końcu jest używane w erze x86?

0

Przesuwa program, w pamięci o 100h.

0
grizz napisał(a):

Przesuwa program, w pamięci o 100h.

Tyle że w binarkach na x86 opcode org nawet nie występuje w formie binarnej
samo

org 100h

skompilowane na x86 nie wypluwa nic.

Jeśli jednak skompiluje się to na ITH to to występuje i robi swoje.

Ja tu się po prostu głowię po ki grzyb cały czas klepie te org 100h kiedy to nic nie robi.
I przy okazji marzy mi się dowiedzieć się o jakimś tricku wykorzystującym orga.

0

Dawno nie kodziłem w asmie, ale org 100h jest chyba niezbędne jeśli chce się stworzyć plik COM, bo chyba pod ten adres jest ładowany kod.

0

To nie jest opcode, można powiedzieć, że to raczej dyrektywa kompilatora. Robimy to dlatego, żeby nie nadpisać czegoś, co DOS nam załaduje właśnie w bajtach 0-255, a jest to PSP - http://en.wikipedia.org/wiki/Program_segment_prefix

0

org [PRZESUNIECIE]
jest po to zeby dodawać przesuniecie do offsetu zmiennych, jeżeli pobierasz adres zmiennej poprzez

mov ax, offset ZMIENNA
dostaniesz adres zmiennej w bajtach od początku PLIKU binarnego + [PRZESUNIECIE]

Ponieważ windows ładuje nasz program pod adres 0x0100h musimy zawsze dodawać to przesuniecie, najprościej poprzez ORG, alternatywą (gdy org jest 0) mogło by być :

mov ax, offset ZMIENNA + 100h

Mało czytelne.... i po to masz org

Dlaczego kompilator nie doda tego automatycznie? Nie zawsze chcesz mieć przesuniecie 0x100, są inne metody uzyskiwania takich przesunięć (dynamiczne) np tak:
mov ax, cs
add ax, 0x10h
mov ds, ax
mov es, ax
teraz poprzez rejestry es i ds możesz poprawnie odwołać sie do zmiennej nawet z dyrektywą org 0.

Mało tego, org pozwala ci wstawić dowolna wartość jako OFFSET co umożliwia np pisanie bootloaderów ładowanych pod adres 0x7c00

1 użytkowników online, w tym zalogowanych: 0, gości: 1