[assembler] za krotki skok

0

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 ;)

0

warunkowy skok czy bezwzględny? Zawsze można rozłożyć etykiety tak aby skok był możliwy.

0

skok warunkowy, po porownaniu cmp, no wlasnie mam tak , ze nie moge rozlozyc etykiet ....

0

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.

0

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

0

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:
0

E, poczytaj o jumpach. Masz np. long jmp albo far jmp

0
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

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

0

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.

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