JMP

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 1 июл 2009.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Ы, насамом деле если я не вру кроме стека ничего и не бывает, ну грубо говоря... ;-
     
  2. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    This line:
    invoke MessageBox,0,szText,szCaption,MB_OK
    is equivalent to:
    stdcall [MessageBox],0,szText,szCaption,MB_OK
    and they both generate this code:
    push MB_OK
    push szCaption
    push szText
    push 0
    call [MessageBox]
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну если хочешь пушить, тогда пожалуйста - по 4 байта текста руками загоняешь в стек, а потом передаешь указатель на текст в стеке нужной тебе функции. Тут или резервировать db, или по 4 байта руками в стек - по-другому никак.

    А мусор в отладчике и не видишь данных потому, что фасм скорее всего сделал так:
    Код (Text):
    1. call @F
    2. db 'my_text',0
    3. @@:
    а дизасм постарался дизассемблировать твой текст. Потому и получился мусор вместо кода. Олька ж не всегда может отличить данные от кода. Сам подумай, насколько это сложно
     
  4. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    ааа.! ясна! ..."а дизасм постарался дизассемблировать твой текст" - точно, теперь въехал!
    Про стек тоже главное знать критерии, что можно и нельзя. Я не знал.
    ... этсамое, а стоит ли на olly 2.0 заменить? или слишком сырой! Я просто думаю надо ли мне проблеммы с ним :) Или его во всю уже юзают? Главное что б принципиально не было
    сильных различий! Ато я в старой версии ещё нифига не соображаю, зато статьи есть.
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Именно так.
    Код (Text):
    1.    call ..continue
    2.    db value,0
    3.    ..continue:
    Лишний раз убеждаюсь, что лучше все делать ручками, чтобы потом твой код не превратился в набор костылей, зашитых под селезенкой. Хотя здесь нужно быть очень внимательным, потому что данный фрагмент размещен не в тексте макроса вызова, а в тексте макроса, переопределяющего pushd. Я лично всегда делаю так.
    Код (Text):
    1. section ".code" code readable executable
    2.   ...
    3.   stdcall MessageBox, NULL, text1, caption1, MB_OK
    4.   ...
    5. section ".data" data readable writeable
    6.   ...
    7.   text1 db "Click me", 0
    8.   caption1 db "Stupid message", 0
    Semiono, сделай себе нормальный шаблон, чтобы постоянно не попадать на одни и те же грабли. Понятно, что код должен находиться в секции кода, т.е. executable, а то что он может быть выполнен и в секции, у которой соотв. флаг не выставлен, больше связано со спецификой конкретной системы и не должно рассматриваться как некоторая закономерность. Далее хватит экспериментировать с библиотечными вызовами, выбирая макросы вызова наобум. У каждого из них есть свои особенности и свое предназначение. Не нужно вызывать API-функции с помощью макросов, использующих Си-конвенцию вызова.
     
  6. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    я именно это и хочу зделать, чтобы не возвращаться к этому потом.
    я просто думал что нибудь продвинутое "хакерское" я могу упустить при этом, и тогда не крута будет :)
    хотя круто это на самом деле когда альтернативный машинный код вместо типичного api, от чего я ещё далёк, к сожалению :)
    А по регламенту кода всё это так и есть в примерах и хелпах, значить не надо мудрить.
    Но у меня один вопрос, а порядок следования секций очень важен?
    И если я правильно понял в одной статье, то что db ? лучше размещать впереди, чем db 'zzz'
    это верно?
     
  7. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    я немного не понимаю о чём речь.
    вообще я думаю что речь о том что надо работать без макросов, а это как я думаю
    push data1
    push data2
    call winapi
    или нет?

    хотя далее:
    или это к слову пример для меня лично?
    или есть нечто ещё?
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    И моё мнение по поводу макросов, я лично думаю, что если нету иного способа исполнения кода,
    то глупо писать то же самое вручную, то что в самом макросе итак следует.
    Это только для понимания, как упражнение только оправдывается.
    Но я наверное не в теме? :)
     
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Есть ещё третье, я немного помедитирую...
    Видимо API очень трудно обойти как нибудь иначе?
    Но наверное в сумме, когда если взять много API как некий кусок программы, то видимо можно это всё выкинуть и построить другой код делающий то же самое и более оптимальный?
    :)
     
  10. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    >И если я правильно понял в одной статье, то что db ? лучше размещать впереди, чем db 'zzz'
    Так и есть. Если определять неинициализиорованые данные в конце файла, то они фактически не будут записываться в exe - изменится только размер образа в памяти.
     
  11. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    vice versa :derisive:
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Так сделай. Можно создать новую ветку на этк тему, чтобы люди представили свои варианты, а ты бы выбрал или синтезировал, так сказать, на основе этого какой-нибудь свой вариант.
    Не очень, ну лучше все-таки сначала рамещать секции с кодом/инициализированными данными, а потом с неинициализированными. Лично я размещаю секции в таком же порядке, в каком это делают используемые мной Си-компиляторы: сначала код (обычно в конце этой секции помещаю и данные только для чтения), потом данные (включая таблицы импорта/экспорта), в конце этой же секции размещаю неинициализированные данные (это возможно, так как формат позволяет отдельно указать размер секции в файле и в памяти), а в самом конце служебные секции типа секции ресурсов или секции с релоками (для библиотек).
    Неверно - я только что об этом написал. Если речь идет об одной секции, то сначала нужно размещать инициализированные данные, а потом неинициализированные, тогда они не будут занимать место в исполняемом файле.
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я об этом недавно писал. stdcall - это мой собственные макрос. Он просто позволяет поместить параметры функции в стек в обратном порядке, а способ обращения к библиотечной функции внутри этого макроса я периодически меняю (по необходимости). Нет надобности все упрощать настолько, чтобы даже параметры явно помещать в стек. Смысл в том, что результаты работы моего собственного макроса предсказуемы, а стороннего не всегда, поэтому нужно либо в деталях изучить то, что ты используешь, либо сделать и использовать что-то свое. Лично я из пакета fasm использую только включаемые файлы из папки equates плюс файл с макросом struct. Для описания ресурсов, таблиц импорта/экспорта использую свои файлы.
     
  14. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    API элементарно обойти, но тогда твое приложение будет завязано на конкретную версию системы. А чтобы сделать приложение инвариантным к версии системы, нужно приложить немало усилий и все равно это не будет гарантировать работоспособность твоего приложения во вновь появляющихся версиях системы. Другое дело, что некоторые подсистемы можно обойти за счет других или использовать одни функции вместо других.