Откуда взялись nop

Тема в разделе "WASM.ASSEMBLER", создана пользователем idsp, 27 май 2010.

  1. idsp

    idsp New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2009
    Сообщения:
    13
    Gодскажите, откуда берутся nop, если, как вы видите, я их ни где не писал, а только jz CostOvr0
    [​IMG]
    компилятор tasm, модель памяти для .386 с сегментацией по 64 Кбайта
     
  2. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    74 7F 90 90 = 74 7F 90 90 в обоих листингах
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    idsp
    Это просто компилятор зарезервировал место на случай, если смещение перехода не влезет в один байт, тогда он поставит jz с двухбайтовым опкодом(цифирки не помню) и двумя байтами смещения.
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Black_mirror
    0F 84 XX XX (где XX XX - смещение)
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Порченый компилятор, раз вставляет в код что хочет.
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Black_mirror
    Посмотрите внимательно, там 16-битные команды, а для 16 бит длинного jcc нет, это, скорее всего, какое-то хитрое выравнивание
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    max7C4
    +1
    idsp
    у тасма как то не просто настраивать длину переходов
     
  8. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    На оптимизацию совсем не похоже.
    При оптимизации возможно выравнивание переходов на 8-байт, особенно если их подряд очень много.

    Можно попробовать short приписать может и сделает так как надо.
    jz short CostOvr0
     
  9. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Для 386+ вообще-то есть. max7C4 же указал его ранее.

    Конечно, сделает. Однако короткий jz тут на пределе (rel8==0x7F), так что при небольшом шевелении, буквально в плюс три байта, перестанет компилироваться.

    ----8<----
    idsp,

    Я думаю, нужно увеличить число проходов ассемблера (ключик /m). По умолчанию TASM однопроходной, уже при двух он соображает лучше.
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Как уже написали выше - используй несколько проходов, он nop выбросит.
     
  11. idsp

    idsp New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2009
    Сообщения:
    13
    задание явно jmp short помогло - nop'ы пропали.
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    И всё же (хотя ТС написал "модель памяти для .386 с сегментацией по 64 Кбайта") код 16-разрядный, иначе бы везде стояли префиксы 66h, 67h. Для тех случаев когда требуется jz за пределом ±127 байт вместо jz a0 пишут
    Код (Text):
    1. jnz a1
    2. jmp a0
    3. a1: ...
     
  13. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    А в чём цель? При одном проходе будут ещё два nop (а от них, вроде, и хотел избавиться idsp).
     
  14. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это ещё зачем?
    На .386 в 16-битном коде есть near переходы, и прыгай себе за 128 байт.
    Он же не на 8086-286 запускать собирается...

    Код (Text):
    1.         .386
    2. code    segment para public 'code'  use16
    3.         assume  cs:code, ds:code
    4. start:
    5.         jmp     entry
    6.         db      256 dup('!')
    7. entry:
    8.         dec     ax
    9.         jnz     start
    10.         ret
    11. code    ends
    12.         end     start
    Код (Text):
    1. Module: test.asm
    2.  
    3. Segment: code PARA USE16 00000109 bytes
    4. 0000                          L$1:
    5. 0000    E9 00 01                  JMP         L$2
    6. 0003    21 21                     AND         word ptr [BX+DI],SP
    7. ; ...............................................................................
    8. 0101    21 21                     AND         word ptr [BX+DI],SP
    9. 0103                          L$2:
    10. 0103    48                        DEC         AX
    11. 0104    0F 85 F8 FE               JNE         L$1
    12. 0108    C3                        RET        
    13.  
    14. Routine Size: 265 bytes,    Routine Base: code + 0000
    15.  
    16. No disassembly errors
     
  15. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Вот и мне интересно - в чём цель "в один проход"?
    Трудно /m в командной строке добавить?
     
  16. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    cppasm,

    Тоже не тоскуешь по кнопке «Редактировать»? :derisive:
     
  17. idsp

    idsp New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2009
    Сообщения:
    13
    Задавать какие-либо ключи в ком. стр. не получится - т.к. весь разговор идет о некой оболочке (для предмета "Микропроцессорные системы"), написанной у нас в универе - в которую входит тасм. Все параметры, видимо, заданы уже где-то внутри...
     
  18. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    idsp,

    Хм. Создай tasm.cfg с этой опцией в каталоге с исходником, TASM должен подхватить (если он оттуда запускается).
     
  19. idsp

    idsp New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2009
    Сообщения:
    13
    просто написать -m ?
     
  20. idsp

    idsp New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2009
    Сообщения:
    13
    или надо для количества проходов мб -m3 (для 3х проходов)?