Witam, pisze projekt z assemblera, i mam taki blad przy kompilkacji:
"error: short jump is out of range "
wiem, ze to jest wtedy, gdy etykieta skoku jest "za daleko" od miejasca wywolania, niestety nie mam mozliwosci jej blizej upchnac. Jak to ominąć???
Kompilator NASM pod linuksem.
Pls pomozcie w miare szybko ;)
warunkowy skok czy bezwzględny? Zawsze można rozłożyć etykiety tak aby skok był możliwy.
skok warunkowy, po porownaniu cmp, no wlasnie mam tak , ze nie moge rozlozyc etykiet ....
Podczas pisania programów w asmie masz do dyspozycji kilka modeli pamięci.
Tiny :kod programu i dane muszą zmieścić się w jednym segmencie 64kb. Zarówno kod jak i dane są bliskie.
Small :Kod programu musi zmieścić się w segmencie i dane muszą zmieścić się w innym. Kod i dane są bliskie.
Medium: Program może nie mieścić się w segmencie, natomiast dane muszą. Kod jest daleki, dane bliskie.
Large :Kod i dane mogą byc większe niż 64kb, ale pojedyncza dana nie może być większa niż 64 kb. Kod i dane są dalekie.
Huge : Program, dane oraz pojedyncza dana mogą przekraczać 64kb. Kod i dane są dalekie. Wskaźniki do tablic są dalekie.
Pamiętaj, że JMP to skok krótki, maksymalnie 128 bajtów od instrukcji. Rozbij to na mniejsze skoki (tak jak w trójskoku). Jak zamieścisz fragment źródła to spróbuję pomóc bardziej.
z tego co wyczytalem w necie, to w nasmie nie ma podzialu na te modele... ale masz racje z rozbiciem na skoki, zrobilem taka tymczasowa funkcje, do ktorej ide skokiem warunkowym, a w niej wywoluje to co chcialem prze call, wtedy nie ma problemu ;)
dzieki za szybkie odpowiedzi
możesz tak:
cmp a, b
je OK ;warunek spełniony
jmp NIE_OK ;warunek niespełniny
OK:
;teraz kod powyżej 128 bajtów
jmp KONTYNUUJ
NIE_OK:
;kod obsługi
KONTYNUUJ:
E, poczytaj o jumpach. Masz np. long jmp albo far jmp
pirat sam napisał(a)
E, poczytaj o jumpach. Masz np. long jmp albo far jmp
przecież pisał, że chpodzi mu ok skok warunkowy, który może jedynie przeskoczyć +/-128 bajtów
abcd napisał(a)
pirat sam napisał(a)
E, poczytaj o jumpach. Masz np. long jmp albo far jmp
przecież pisał, że chpodzi mu ok skok warunkowy, który może jedynie przeskoczyć +/-128 bajtów
Tak sie składa że skoki warunkowe też mogą przeskakiwać o +32767/-32768 bajtów.
w nasm domyślnie skok jest krótki, np. je label.
Radą na błąd jest je near label albo przedefiniowanie rozkazu je na makro które sprawdzi czy label jest dalej od eip o 127/-128 bajtów.
Alternatywnie można zmienić ilość przebiegów kompilowania - w helpie rozdział 2.1.16 (opcja -O)
Jeszcze lepszym rozwiązaniem jest "poprawka" funkcji tokenize() w źródłach assemblera, polegająca na dodaniu tokenu near dla każdego relokowalnego skoku.