Приколы условного перехода

Тема в разделе "WASM.ASSEMBLER", создана пользователем STRanger, 6 фев 2005.

  1. STRanger

    STRanger New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2005
    Сообщения:
    2
    Адрес:
    Russia
    (начал изучать асму пару дней назад :) отсюда все вытекающее :)))



    Что0то никак не могу понять подводных камней: использую ф-ю jne, после cmp, естественно, которая делает переход на метку Error, находящуюся в конце кода. TASM выдает такую ошибку:

    **Error** compile.asm(31) Relative jump out of range by 0001h bytes

    Долго не мог понять смысл, но, в рез-те упорных экспериментов, убрав одну команду между JNE и меткой - все пошло! Смотрел в отладчике - там не так много "расстояния" между ними - где-то 92h - в чем причина? Какие ограничения есть у JNE (и что значит БЛИЗКИЙ и КОРОТКИЙ переходы??? (Юров стр.529))



    ЗЫЖ еще вопросик - раз уж пошла такая пьнка - в том же Юрове написано, что выбор правильного выравнивания сегментов в памяти может ускорить доступ к ним и соответственно работу - как выбрать этот правильный способ?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    - short (БЛИЗКИЙ) - однобайтное смещение +127 .. -128 байт

    - near (КОРОТКИЙ) - размер смещения зависит от режима адресации 2 байта (+32767 .. - 32768) в 16ти разрядном режиме и 4 байта (+2<sup>31</sup>-1 .. -2<sup>31</sup> в 32х разрядном режиме.



    смещение считается от начала _следующей_ за переходом команды

    ты видимо написАл jne short, вот TASM и ругается, что слишком далеко.
     
  3. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    Судя по всему, программа для ДОС. Если да, то:



    Зубков:

    Команды Jcc не поддерживают дальних переходов, поэтому, если требуется выполнить условный переход на дальнюю метку, необходимо использовать команду из набора Jcc с обратным условием и дальний JMP, как, например:
    Код (Text):
    1.     cmp ax,0
    2.     jne local_1
    3.     jmp far_label
    4. local_1:


    т.е. JNE не может быть дальним.
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    А зачем дальний?

    FAR JUMP - это переход между сегментами с перезагрузкой CS
     
  5. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    Да, я чуть лоханулся... Но скомпилировать
    Код (Text):
    1.     jne near_label
    2.     db  128 dup (90h)
    3. near_label:
    в TASM никак не удается. В MASM - без проблем.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
  7. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    S_T_A_S_> ты видимо написАл jne short, вот TASM и ругается, что слишком далеко.



    Есть и другая гипотеза.

    jcc near не входит в базисный набор инструкций 8086, вот tasm и отказывается их компилировать без дополнительных директив. ;)
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Да, наверное так и есть, но я никогда не использовал tasm от борланда, а только от Rst#7 - там таких директив и в помине не было :)
     
  9. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    Хитрый MASM компилирует jne offset_more_than_127 в
    Код (Text):
    1. _TEXT:0104                 jz      loc_10109
    2. _TEXT:0106                 jmp     loc_10189
    3. _TEXT:0109 loc_10109:
    :), а чтобы получить четырехбайтную команду jne near, и В TASM, и в MASM нельзя пользоваться директивами .model, .code и т.п., а следует писать

    _TEXT segment word public 'CODE' use16 и т.п., и не забыть директиву .386. Вот такие капризные компиляторы :)
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    их век уже прошёл :)

    FASM рулит!
     
  11. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    И напоследок:
    Код (Text):
    1. hey_stupid_comliler_let_me_jnz_over_127_bytes   macro param
    2. local   current_position
    3.     dw  850Fh
    4. current_position:
    5.     dw  param - current_position - 2
    6. endm
    7. ;drunk coded but seems to be working


    Название макроса можно изменить :)