Что делает эта строка в коде?

Тема в разделе "WASM.BEGINNERS", создана пользователем 1lith, 24 янв 2020.

Метки:
  1. 1lith

    1lith New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2019
    Сообщения:
    1
    https://pastebin.com/g5UWikav

    >mov [esp+10h+var_10], eax
    Зачем в этой строке к 10h прибавляется var_10? Как я понял, var_10 = -10h, то есть в итоге получается ноль.
     
    Последнее редактирование: 24 янв 2020
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    Я вот кстати никогда до конца не понимал, почему GCC/MinGW делает "mov [esp + *], <reg>" вместо "push <reg>" при вызове функций, это что быстрее?
     
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Это скорей всего дизасм. var_10 это подсказка тебе что это за локальная переменная, а 10 - 10 дают [esp + 0], верхушка стека. Если вглядеться, в стеке ровно 10h байт и выделяются под локальные переменные и аргументы.

    Это для модели вызова типа ccall или в этом духе, где стек функция не выравнивает, esp каким было таким и остается после выхода из нее. Поэтому аргументы засовываются в заранее выделенное место. Шут знает кто и зачем это придумал, ntdll'ные апи например так себя ведут. Возможно как-то связано с тем, что указатель стека должен быть выравнен на 16.
     
    Последнее редактирование: 24 янв 2020
  4. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Это помещение аргумента в стек для последующего вызова printf. В данном случае приводит к тому же результату (расположение аргумента наверху стека) что и push eax.

    cdecl, но бывает что и stdcall вызовы компиль оптимизирует подобным способом. В x64/fastcall тоже часто встречается.

    Подозреваю что оптимизация по скорости.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    1lith,

    > Как я понял, var_10 = -10h

    Не правильно понял, это не переменная, а её смещение в локальном буфере, который в стековом фрейме. Это фича диза такая(IDA), помимо смещения для наглядности показывается условная переменная. Что бы было понятно смотри формат эффективного адреса(MODRM): Intel® 64 and IA-32 Architectures Software Developer’s Manual, 2.1.3 ModR/M and SIB Bytes

    - поле modrm не кодирует регистр esp, для этого используется дополнительный байт SIB, который определяет базу(esp). В эффективном адресе не может быть два смещения. Оно определено в modrm, sib же это индексация base_reg + scale*index_reg.
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Это просто тупой диз ассемблер. Правильная команда выглядит так
    mov [esp+var_10+10h], eax
    И тут видно что var_10 - это структура по смещению 10h этой структуры записывается eax.