(fasm) push eax+1

Тема в разделе "WASM.ASSEMBLER", создана пользователем GoldFinch, 8 ноя 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Как написано в документации к фасму,
    Однако как оказывается работают не только пробелы, но и другие символы, так что
    push eax+1
    ассемблируется как
    00000000: push eax + 1; 50 6A 01 (#03)

    думаете баг? нед! это
    push eax
    push +1
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    push нескольких переменных или констант за одну запись удобно, но использовать запись типа push eax+1 в реальных программах явно не стоит ибо создаст лишнюю путаницу :))
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    согласен, к тому же если надо именно так - напиши макрос
     
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    GoldFinch на nasm это вот так
    Код (Text):
    1. %macro push 1-*
    2.     %rep %0
    3.     push %1
    4.     %rotate 1
    5.     %endrep
    6. %endm
    и тогда возможна инструкция push eax,ebx,ecx,eax
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mikl___
    ну а на fasm так
    Код (Text):
    1. macro push [par]
    2. {
    3.   forward push par
    4. }
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    push eax + 1 - это push eax +1, поэтому все работает в соответствии с документацией, т.к. фасм поддерживает не только унарный минус, но и унарный плюс, а вот это push eax * 1 по идее работать не должно.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Phantom_84
    в соответствии с документацией push eax + 1, но не push eax+1 :))
    полюбому через запятую логичнее, чем такие извраты.
     
  8. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Phantom_84
    тогда почему push eax+1 работает push eax-1 работает push eax ebx работает, а push eax+ebx не работает? :)
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    EDIT: адресовано Y_Mur

    Для fasm'а обе строки идентичны :)
    В нем знаки арифметических операций являются разделительными символами. Так я тоже не сторонник подобных извратов, но раз в fasm'е реализовали это без использования запятых, наверное этому была своя причина. Просто не нужно извращаться, а то действительно легко запутаться, например, после непродолжительных экспериментов выяснилось, что в записи push eax 1 -1 строка 1 -1 расценивается как одно выражение, что впрочем вполне логично, но вот запись push eax 1 (-1) уже приводит к генерации трех команд push, что не слишком логично, особенно с учетом предыдущего варианта.
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Mikl___, сам догадаться не можешь? - нельзя к имени регистра приставлять знак операции - такое возможно только в адресных выражениях.
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    О, все-таки и push eax 1 (-1) тоже вполне логично, т.к. в выражении 1 (-1) явно отсутствует знак бинарной операции между операндами (между единицей и скобкой)!
     
  12. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Phantom_84 да догадался давно, там смайл стоит -- хотя отличить унарный ± от суммы/разности если отсутствуют явные разделители сложно! push/pop с аргументами через пробелы еще tasm поддерживал, а вот для masm нужно писать макрос
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ну вы и нафлудили %)
    речь шла о том что препроцессор вообще убирает пробелы и формирует список отдельных элементов "push","eax","+","1", а ассемблер вычисляет выражения в операндах и получается "push","eax","1"