Директива org $ в FASM. Недочет или фича?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Johnikum, 28 окт 2004.

  1. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Добрый вечер.



    Имеется кусок кода (пример):
    Код (Text):
    1.  
    2.     mov eax,$
    3.     ret
    4.     org $-1
    5.     nop
    6.     mov eax,$
    7.  


    компилируется он в следующее:

    FASM:
    Код (Text):
    1.  
    2. 00000288: B888104000   mov    eax,00401088 ;првавильный адрес
    3. 0000028D: C3           ret                 ;этого не должно быть видно
    4. 0000028E: 90           nop
    5. 0000028F: B88E104000   mov    eax,0040108E ;-здесь должно быть 00040108F
    6.  


    MASM:
    Код (Text):
    1.  
    2.  00000400: B800001040  mov    eax,40100000 ;верно
    3.  00000405: 90          nop                 ;ret не видно
    4.  00000406: B806104000  mov    eax,00401006 ;адрес правильный
    5.  


    Это в FASM'е так должно быть?
     
  2. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    org directive sets address at which the following code is expected to appear in memory.

    Из руководства по фасму. С моими скудными познаниями английского языка из вышенаписанного следует, что появление следующего за директивой кода будет по адресу, указаноому в директиве. На процесс компиляции это никак не влияет.
     
  3. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    появление следующего за директивой кода будет по адресу, указаноому в директиве.

    ну так вот именно...

    Адрес то мы меняем на предыдущий, а он не меняется
     
  4. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    похоже в fasme эта директива влияет только на адреса, ассоциируемые с метками и командами во время компиляции,

    команды же не накладываются, а записываются последовательно



    mov eax,$

    ret

    _this:

    org $-1

    nop

    mov eax,$

    call _this



    В этом примере call'иться будет не nop,

    a mov eax,$
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    org $-1 в FASM не работает так, как это принято в некоторых других ассемблерах - это связано с внутренними особенностями реализации.

    Как правило, нужного результата можно добиться при помощи директив virtual или store, а то и просто if / end if.
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Как сказал Turkishorg directive sets address at which the following code is expected to appear in memory.expected переводиться, как вероятной. То есть компелятор нойдя дерективу org будет считать, что последующий код вероятно находиться в указонном месте памяти.Поэтому команда org $-1 срабатывает, как $=$-1.
     
  7. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    S_T_A_S_

    нужного результата можно добиться при помощи директив virtual или store, а то и просто if / end if.



    Просто нужно "замазать" в зависимости от некоторых условий, код сгенерированный другим макросом.
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Используй store.

    Вообще, покажи код, что-нибудь придумаем :)
     
  9. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Вообще, покажи код, что-нибудь придумаем

    в принципе уже обошел проблему, просто пришлось не использовать конструкцию, так же как и на MASM'е (я про org $-1), сделал по другому.

    На вопрос, заданный мной первоначально, ответ получил.

    Всем спасибо.