Вы стали жертвой ужасного синтаксиса AT & T.
В сборке x86 есть суффикс инструкций, например, l (long), w (word), b (byte).
Нет, это не так.У мерзости, которая является синтаксисом AT & T, есть это.
Является ли jmpl чем-то другим.
Да, это косвенный переход к абсолютному адресу.-Near- переход к -long- адресу ljmp
в синтаксисе gnu - -far-jump.
По умолчанию для перехода используется близкий переход к относительному адресу.
Обратите внимание, что синтаксис Intelдля этого скачка есть:
jmp dword [ds:0x0804839b] //note the [] specifying the indirectness.
//or, this is the same
jmp [0x0804839b]
//or
jmp [main]
//or
jmp DWORD PTR ds:0x804839f //the PTR makes it indirect.
Я предпочитаю []
, чтобы подчеркнуть косвенность.
не переходит к 0x0804839b, но читает слово с указанного адреса и затем переходит на адрес, указанный в этом слове.В синтаксисе Intel косвенность явно.
Конечно, вы намеревались перейти к 0x0804839b (он же main :) напрямую, что делается с помощью:
Hm, most assembler do not allow absolute far jumps!
It cannot be done.
См. Также: Как кодировать далеко абсолютный JMP / CALLинструкция в MASM?
Прыжок в ближнем / дальнем относительном направлении (почти) всегда лучше, потому что он все равно будет действителен, когда ваш код изменится, прыжок в длину может стать недействительным.Также более короткие инструкции обычно лучше, потому что они занимают меньше места в кеше команд.Ассемблер (в режиме Intel) автоматически выберет для вас правильную кодировку jmp.
SPARC
Это совершенно другой процессор, чем у x86.От другого производителя, используя другую парадигму.Очевидно, что документация SPARC не имеет никакого отношения к документам x86.
Здесь вы найдете правильную документацию для jmp
.
https://www.felixcloutier.com/x86/jmp
Обратите внимание, что Intel не определяет разные синтаксисы для относительной и абсолютной формJMP.Это связано с тем, что Intel хочет, чтобы ассемблер всегда использовал короткий (относительный) прыжок, если цель не находится слишком далеко, и в этом случае используется дальний переход (jmpl в синтаксисе AT & T).
Красота заключается в том, чтоАссемблер автоматически использует правильный прыжок для вас.
Принудительное возвращение GNU к здравомыслию
Вы можете использовать
.intel_syntax noprefix <<-- as the first line in your assembly
mov eax,[eax+100+ebx*2]
....
Чтобы заставить GNU использовать синтаксис Intel, это вернет вещи к тому, как они были разработаныIntel и далеко от синтаксиса PDP7 , используемого GNU.