не понимаю смысл этих операций со значениями регистров

Тема в разделе "WASM.BEGINNERS", создана пользователем crazybit, 8 янв 2010.

  1. crazybit

    crazybit New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    7
    Привет всем! Возможно, я не слишком внимателен и привык бегло читать учебники, но приведённые ниже и, вроде бы простые операции, мне не совсем логически понятны. Это часть кода, адаптированного для компиляции в fasm (я понимаю, что у него тоже свой синтаксис и некоторые фишки) :

    push (76 shr 2) + 1 ; именно эти участки вызывают непонимание
    pop edx
    .outer:
    ...
    .inner:
    ...
    sub al,((3Eh shl 2)+'A'-'+') and 0FFh ; особенно это:)
    ...

    Вопросы: я согласен, что есть переменные и константы, а какую-то комплексную примитивную арифметическую операцию можно записать одной строкой для удобства чтения кода или иных целей, тем более когда синтаксис конкретного компилятора предоставляет такую возможность, но для чего городить такой огород, ведь и так понятно, что, к примеру, x=(2+2+1)*y проще сразу записать как x=5*y или хотя бы (4+1)*y. Похожие вещи видел и в других исходниках, особенно когда реализуются алгоритмы работы с PE-файлами, там нередко встречается что-то вроде:
    ... 8000000h + 400000h .
    Конечно, я ещё ничего сложнее HelloWorld средствами MessageBox не кодил и совсем ничего не знаю, потому и возник столь простой вопрос к Вам, камрады.
     
  2. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Код (Text):
    1. push         (76 shr 2) + 1
    Я так понимаю, что тот, кто это писал, оставил как бы комментарий. Чтобы понятно было, откуда взялось значение, ложИмое в стек.
     
  3. crazybit

    crazybit New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    7
    Стек стеком, возможно я и не вкурил междустроковый смысл и линки автора к мануалам при чтении его асм-реализации конкретного алгоритма.
    Не спорю, какие-то значения бывают постоянны и их можно (и даже нужно) объяснять, однако комментариев в коде по этому поводу нет. В общем, непонятно для чего нужно брать конкретное значение, проводить с ним простейшие логические/арифметические операции из нескольких составляющих, которые можно сразу сократить.

    sub al,((3Eh shl 2)+'A'-'+') and 0FFh ; непонятен всё же этот огород :)

    Кстати, а как будет выглядеть перенос такой строчки кода для MASM без потери компактности в плане длины листинга?

     
  4. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    По-моему, ты чутка не вкурил.
    Дело в том, что вот это выражение - "((3Eh shl 2)+'A'-'+') and 0FFh" вычисляется во время компиляции всего лишь один раз. Если ты пропустишь через дизассемблер получивший машинный код, ты увидишь следующее:
    sub al, 01h (к примеру).
    Или я не вкуриваю, что тебе нужно.
     
  5. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    На масме, соответственно, будет точно так же.
     
  6. crazybit

    crazybit New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    7
    Это не отрицаю, возможно не так выразился.
    Если это sub al,01 то весь смысл огорода с построением данной операции лишь в том, чтобы таким образом прокомментировать работу кода? Будем надеяться что это так:) Thanks, Phuntik!
     
  7. dr_godsl

    dr_godsl New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2009
    Сообщения:
    60
    так пишут для наглядности (читабельности кода), вот если бы тебе написали push 0000FD34h, тебе будет понятно откуда автор (или ты) взял это число? а тут тебе сразу расписано че и откуда. попробуй написать строчек 200-300 асмовского кода, а через неделю две загляни туда. знаешь что почуствуешь? черт ногу сломит.
     
  8. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    dr_godsl
    Собственно, это я и пытался выразить, но, как видно, не совсем удачно)
     
  9. crazybit

    crazybit New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    7
    Что-ж, советы пацанов с района убедили в том, что это вариант комментария-в-коде:) Хотя, сам листинг там совсем небольшой. Надо будет посмотреть оригинальное описание математики алгоритма, чтобы сравнить с кодом. Спасибо!
     
  10. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    лол что?

    Это как на си писать printf("%d",(2+2)); в скобках написано (2+2) а в функцию попадет 4.

    те как аргумент для "push" пойдет 4, ну вместо "+" может стоять "shr" допустим, сути не меняет.
     
  11. crazybit

    crazybit New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    7
    2spa: да рассказал уже народ. понятно, что компилятор сгененрирует эти строки с каким-то одним результирующим значением, непонятно лишь было, зачем городить такую операцию, кроме как действительно для наглядности соотнести конкретные куски кода и алгоритма, который реализуется.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    всё верно написал.
    мы так показываем откуда идёт эта константа, как она строится, и возможно почему.
    Например, одно дело написать "push 0x410000", другое - "push IMAGE_BASE + SECTION_OFFSET".
     
  13. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    какой хороший форум. старательный. даже после того, как всё уже ясно раздаются звуки эха)
     
  14. crazybit

    crazybit New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    7
    Так это и замечательно, что здесь ещё остались интеллигентные пацаны:) А то я думал щаз троллота как набежит.
    Всем спасибо!