дальний jmp в тот же сегмент на fasm

Тема в разделе "WASM.BEGINNERS", создана пользователем Dr_Algorithm, 22 сен 2007.

  1. Dr_Algorithm

    Dr_Algorithm New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    13
    Может быть, это прозвучит глупо, но как в fasm (в формате binary) выполнить прямой jmp far в тот же сегмент? И вообще, есть ли аналог масмовской директивы "seg"? Вот мой код (для примера)
    Код (Text):
    1. format binary
    2.  
    3.                 org     100h
    4. xLabel103:
    5.                 ...
    6.                 jmp     cs:xLabel103; на это компилер ругается
    7.                 jmp     far xLabel103 ; это не работает, т. к. не указан сегмент
    Как это разрешить?
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    jmp far [cs:xLabel103]?
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Тут же флат модель.
    Программа состоит из секций а не сегментов.
    а так через другой сегментный рег обращ как Вам выше сказали.
    К фасму куча туториала и там куча примеров
    и доки путные
     
  4. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    wsd, какая flat-модель?! Окстись! :)
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    G13
    Да прохлопал.
    У меня просто фасм автоматом с вин ап сассоциировался:)
    Спасибо!
     
  6. Dr_Algorithm

    Dr_Algorithm New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    13
    И что сделает jmp far [cs:xLabel103]? Это же непрямой переход! Считает 4 байта начиная с адреса xLabel103, запишет их в CS:IP и программа порушится. это я уже экспериментално проверил
    Если бы я перемещал данные - другое дело, а мне переход нужен
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    mov eax, xLabel103
    jmp far [cs:eax]?
     
  8. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    t00x
    Это же то же самое)))
    Dr_Algorithm
    Код (Text):
    1. push es
    2. push cs
    3. pop es
    4. mov word [Labl-2],cs
    5. wbinvd ;или че-то другое, что позволит избежать проблем с кэшом
    6. ;Может быть, это:
    7. ;xor eax,eax
    8. ;cpuid
    9. pop es
    10. jmp far 0:xLabel103
    11. Labl:
    Судя по всему, файл .com... Он может быть загружен по любому адресу и единственный способ для приложения (неважно, какой транслятор) узнать сегмент - смотреть значение в CS.
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    10110111
    Если не ошибаюсь, leo уже не раз упоминал, что все современные процессоры (включая все P6 и выше) отслеживают запись в код, и никаких проблем быть не должно.
    И еще хотел спросить... а зачем вообще здесь все push/pop, если Вы все равно пишете из cs: "mov word [Labl-2],cs"?
     
  10. Dr_Algorithm

    Dr_Algorithm New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    13
    Кажется, придумал:

    Код (Text):
    1. jmp short continue
    2. addr rd 1
    3. continue:
    4. push cs
    5. pop  word [addr+2]
    6. mov bx, target_label
    7. mov word [addr], bx
    8. jmp far [addr] ; получился всё равно непрямой переход ;-) Но это лучше, чем ничего
    А жаль, что нет аналога seg
     
  11. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Очепятка...
    Надо было
    Код (Text):
    1. mov word [es:Labl-2],cs
    Блин... совсем заглючило))) С учетом всех замечаний результат:
    Код (Text):
    1. mov word [cs:Labl-2],cs
    2. jmp far 0:xLabel103
    3. Labl:
     
  12. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Dr_Algorithm
    А для чего вообще вся эта необходимость использовать именно дальний переход? Сегмент ведь остается одним и тем же.
     
  13. Dr_Algorithm

    Dr_Algorithm New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    13
    А. понял, это самомодифицирующийся код, вместу нуля пишем cs, да? А вот насчёт
    mov ..., cs что-то сомневаюсь... Это какой-то макрос?
     
  14. Dr_Algorithm

    Dr_Algorithm New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    13
    Это так, для общего развития )))
     
  15. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Нет, не макрос. Вот опкод mov word [cs:0],cs :
    2E 8C 0E 00 00
     
  16. Dr_Algorithm

    Dr_Algorithm New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    13
    Спасибо, отлично работает! Я это в виде макроса оформил :)