странности gnu as: нормализация сегмента

Тема в разделе "WASM.UNIX", создана пользователем kaspersky, 25 май 2007.

  1. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    если в команде далекого вызова/перехода по непосредственному адресу сегмент меньше 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'а;
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    у меня GNU AS 2.16
    Код (Text):
    1. .text
    2. .globl main
    3. main:
    4.     ljmp    $10, $0x100000
    так что все нормально
     
  3. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    а у меня и jmp $10, $100000, и ljmp $10, $100000, и ljmp $0xA, $100000
    дают EA 40 42 0F 00 00 00, значит, баг все-таки есть ;(

    кстати, а зачем тут вообще "l"? это же ведь не ljmp *0x666
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    * показывает косвенность вызова
    jmp *%eax (адрес в EAX)
    jmp *0xABCDEFAB (адрес 0xABCDEFAB)
    jmp *(0xABCDEFAB) (адрес в памяти по адресу 0xABCDEFAB)
    jmp *(%eax) (адрес в памяти по адресу в EAX)
    префикс l показывает "дальность" вызова
    ljmp
    lcall
    lret
    сочетать тоже можно
    ljmp *(%eax) (дальний jump по far адресу записанному в памяти по адресу в EAX)
    да, кстати, с макросами тоже по-моему есть баг
    код
    Код (Text):
    1. .macro MAKE number
    2.     .if \number < 4
    3.     pushl    $\number * 4
    4.     MAKE \number + 1
    5.     .endif
    6. .endm
    7.  
    8. .text
    9. MAKE 0
    дает
    а не
     
  5. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    > префикс l показывает "дальность" вызова
    это я в курсе. в конструкции ljmp *0x666 он нужен, чтобы показать, что мы берем seg:offset, а не только offset, ну а jmp $0x69, $0x666 эквивалентно ljmp $0x69, $0x666. по моему так и никак не иначе ;)
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    ну да
    все же, имхо, с префиксом более наглядно :derisive:
     
  7. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    rei3er
    > jmp *0xABCDEFAB (адрес 0xABCDEFAB)
    > jmp *(0xABCDEFAB) (адрес в памяти по адресу 0xABCDEFAB)
    jmp 0xABCDEFAB -> (переход по адресу 0xABCDEFAB)
    jmp *0xABCDEFAB -> (переход по адресу [ABCDEFABh])
    jmp *(0xABCDEFAB) -> (переход по адресу [ABCDEFABh])
     
  8. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    {Немного оффтоп}
    У меня эта прога :

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

    Почему так ??
     
  9. black_hole

    black_hole New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    44
    Это про меня:)
    Cобственно один вопрос пока то, что Вы написали, отличается от http://asm.sourceforge.net/articles/linasm.html чем-то существенным?