если в команде далекого вызова/перехода по непосредственному адресу сегмент меньше 0Fh, то GAS выполняет принудительную "нормализацию" сегмента к 00h, что создает проблемы при работе с селекторами, для которых правила нормализации неприемлемы в принципе!!! проверялось на as 2.11.2 и 2.15: o AT&T: jmp $10, $100000 - транслируется в -> jmp far ptr 0:0F4240h; кто может объяснить мне почему и как эту беду можно обойти? p.s. сейчас начал писать faq для тех кто переходит с win-asm'а на unix-asm. прошу всех заинтересованных слать мне вопросы. пока закончен только один раздел - сжатое, но полное и наглядное отличие AT&T от Intel'а;
а у меня и jmp $10, $100000, и ljmp $10, $100000, и ljmp $0xA, $100000 дают EA 40 42 0F 00 00 00, значит, баг все-таки есть ;( кстати, а зачем тут вообще "l"? это же ведь не ljmp *0x666
* показывает косвенность вызова jmp *%eax (адрес в EAX) jmp *0xABCDEFAB (адрес 0xABCDEFAB) jmp *(0xABCDEFAB) (адрес в памяти по адресу 0xABCDEFAB) jmp *(%eax) (адрес в памяти по адресу в EAX) префикс l показывает "дальность" вызова ljmp lcall lret сочетать тоже можно ljmp *(%eax) (дальний jump по far адресу записанному в памяти по адресу в EAX) да, кстати, с макросами тоже по-моему есть баг код Код (Text): .macro MAKE number .if \number < 4 pushl $\number * 4 MAKE \number + 1 .endif .endm .text MAKE 0 дает а не
> префикс l показывает "дальность" вызова это я в курсе. в конструкции ljmp *0x666 он нужен, чтобы показать, что мы берем seg:offset, а не только offset, ну а jmp $0x69, $0x666 эквивалентно ljmp $0x69, $0x666. по моему так и никак не иначе
rei3er > jmp *0xABCDEFAB (адрес 0xABCDEFAB) > jmp *(0xABCDEFAB) (адрес в памяти по адресу 0xABCDEFAB) jmp 0xABCDEFAB -> (переход по адресу 0xABCDEFAB) jmp *0xABCDEFAB -> (переход по адресу [ABCDEFABh]) jmp *(0xABCDEFAB) -> (переход по адресу [ABCDEFABh])
{Немного оффтоп} У меня эта прога : .text .globl main main: ljmp $10, $0x100000 В впринципе не компилится ! Компилить пытался в GNU assembler version 2.16.91.0.7 (x86_64-mandriva-linux-gnu) using BFD version 2.16.91.0.7 20060317 И в результате: 1.S: Assembler messages: 1.S:4: Error: suffix or operands invalid for `ljmp' Почему так ??
Это про меня Cобственно один вопрос пока то, что Вы написали, отличается от http://asm.sourceforge.net/articles/linasm.html чем-то существенным?