Азы. Счетчик адреса в сочетании с ORG. TASM.

Тема в разделе "WASM.BEGINNERS", создана пользователем l_inc, 23 окт 2006.

  1. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    l_inc
    org меняет текущее значение счётчика команд, который символически обозначается как $ во многих ассемблерах (не только масм/тасм). Поэтому Юров прав. Теперь конкретно по теме jmp $:

    jmp address

    Тут операнд address может быть абсолютным или относительным. Если этот адрес попадает в диапазон -127 + 128 относительно текущего счётчика, то компилятор принимает решение в целях оптимизации размера использовать относительный jmp. Что мы имеем в случае $? Разность адреса следующей команды ($+2) и адреса операнда ($) = $+2-$ = 2. 2 попадает в диапазон относительных адресов и компилятор решает использовать именно короткий вариант jmp EB FE, т.е. jmp -2. База, которая задаётся через org, никак не влияет на эти вычисления.
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    $ - текущее значение указателя счетчика команд в конкретном месте.
    сразу за org он становится равным параметру org:

    Код (Text):
    1.     org 100h
    2. a   equ $ ; a=100h
    3.     nop
    4. b   equ $ ; b=101h
    и т.д.
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    shoo
    Спасибо за разъяснения. Я в курсе.
    Quantum
    Спасибо. Я это все знаю. Но Вы здесь опять принимаете за аксиому именно то, что я и прошу объяснить. А именно: для меня совсем не факт, что в данном случае компилятор должен принимать решение формировать короткий (он же относительный) переход (я ведь предполагал, что jmp $ должен уводить вперед на 100h, а это уже совсем не в диапазоне коротких переходов). Кроме того, вопрос не в компиляторе, а в препроцессоре. По моему мнению, согласно Юрову, препроцессор должен преобразовать
    Код (Text):
    1. masm
    2. model tiny
    3. .code
    4. org 100h
    5.  
    6. start:
    7.     jmp near ptr code_seg
    8.         message db "Ош-ка чтения"
    9.     code_seg:
    10.     xor ax, ax
    11.     mov ss, ax
    12.     ..............................
    13.     mov si, offset message - 100h
    14.     ..............................
    15.     jmp $
    16.     ..............................
    17. end start
    вот в это:
    Код (Text):
    1.                                               ;masm
    2.                                                        ;model tiny
    3.                                                        ;.code
    4.                                                        ;org 100h
    5.  
    6.                                                        ;start:
    7. :0000         jmp +C                                                 ;здесь очевидно, что переход будет относительным
    8. :0002         db "Ош-ка чтения"             ;message
    9.                                                        ;code_seg:
    10. :000E         xor ax, ax
    11. :0010         mov ss, ax
    12.                  ..............................
    13. :01C1         mov si, (2h + 100h) - 100h ;offset message - 100h
    14.                  ..............................
    15. :02F3         jmp (2F3h + 100h)            ;$                  ;а вот здесь совсем не очевидно (вроде переход по абсолютному адресу)
    16.                  ..............................
    17. :0300
    18.                                                       ;end start
    Я закомментировал те строки, которые должен, по-моему мнению, убирать препроцессор. Все остальное передается транслятору.
    P.S. Адреса команд я выбрал отфанаря, учитывая только длины команд.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Стоп. Все. Я понял свою ошибку. Код будет преобразовываться вот в такой:
    Код (Text):
    1.                                               ;masm
    2.                                                        ;model tiny
    3.                                                        ;.code
    4.                                                        ;org 100h
    5.  
    6.                                                        ;start:
    7. :0100         jmp +C                                                 ;здесь очевидно, что переход будет относительным
    8. :0102         db "Ош-ка чтения"             ;message
    9.                                                        ;code_seg:
    10. :010E         xor ax, ax
    11. :0110         mov ss, ax
    12.                  ..............................
    13. :02C1         mov si, 102h - 100h ;offset message - 100h
    14.                  ..............................
    15. :03F3         jmp 2F3h + 100h            ;$                     ;итого: переход будет тоже относительным
    16.                  ..............................
    17. :0400
    18.                                                       ;end start
    Моя ошибка была в том, что я думал, что ORG 100h влияет не только на $, но и на OFFSET тоже, а этого, насколько я помню, Юров не писал. А еще я не подумал, что препроцессор может проставлять предположительные смещения команд перед передачей текста транслятору. Все: Юров - прав, а я - нет. Всем большое спасибо за участие. Тема закрыта.