Использовать esp для адресации массива

Тема в разделе "WASM.BEGINNERS", создана пользователем Adrax, 21 сен 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Хм черт а ведь была такая мысль =) сенкс
     
  2. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Ээээ...
    Вижу дискуссия зашла далеко от первоначального моего вопроса, но вспоминая мой исходник - я пытался положить в esp константу и сделать div esp - программа выдаёт неверный результат (всегда 0)

    Так что же - юзать esp в своём приложении нельзя ни под каким видом?
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Adrax
    Подпись - супер. Добавьте еще 2+2=4 :)

    Все нормально делится у меня:
    or eax, -1
    mov edx, 0x100
    div esp
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я так и не нашел в коде 'div esp'. Есть 'div ebp'. Ошибка происходит на этой инструкции?
     
  5. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 Mika 0x65
    Нет, я заменял ebp на esp
    т.е. mov esp,2710h;разумеется, esp был сохранён в переменную и после вычислений возвращён на место
    div esp

    Получается вычисление с ошибкой почему-то...
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    KeSqueer
    при чем тут 2+2? :)
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Great
    А почему 2B?

    Можно тогда так: a+(b-a)=b
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    KeSqueer
    вариация гамлета - to be or not to be (2b or not 2b)
     
  9. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 Great
    Да, это из Гамлета. Знаменитый монолог:
    "Быть или не быть - вот в чём вопрос.
    Достойно ли смиряться под ударами судьбы
    Иль лучше оказать сопротивленье:
    В смертельной схватке с целым морем бед
    Покончить с ними? Умереть, забыться..."

    Сорри за оффтоп, просто я сам люблю Шекспира... И, помнится, завоевал сердце своей жены, цитируя ей "Гамлета" и "Ромео и Джульетту"
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Супер!
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    А проблема с esp решена?
     
  12. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Уважаемые программисты!
    В esp поместить константу и сделать div esp у меня получилось
    Думаю, дело в том, что я неправильно создаю динамический массив
    Смотрите: для создания статического массива word'ов я делаю так: array dw 1000000 dup 0, например.
    Создать такой же массив можно ли вот таким образом:
    invoke GlobalAlloc,GPTR,2000000
    mov bx,word[eax]
    mov [array],bx
    ?
    В чём я сомневаюсь - правильна ли адресация? и способна ли GlobalAlloc выделить два миллиона байт, или больше 65336 нельзя?
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Adrax
    Нет, адресация неправильна. Во-первых, 'mov bx, word[eax]' кладет в bx _содержимое_ по адресу еах, а не сам адрес, во-вторых, bx --16 битный регистр, а значит 16 верхних бит адреса будут потеряны. Если требуется сохранить указатель на массив в переменной, то следует просто написать 'mov [array], eax'. А для использования этого адреса необходимо сначала считать адрес из переменной: 'mov eax, [array]', а затем уже адресовать элемнты массива по еах 'mov dword [eax], 0x0', 'mov dword [eax + 0x4], 0x0' и т.д.
     
  14. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 Mika0x65
    Дошёл уже сам. Насчёт указателей - это да

    Но вот массив типа array dw 1000000 dup 0
    создаётся именно так, как я делал с GlobalAlloc - проверил уже
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    нет, mov bx,word [eax] там точно не нужен
     
  16. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 Great
    При такой адресации нужен word ptr на первый элемент массива. Получаю, как умею...
    Другое дело - каковы возможности GlobalAlloc в этом смысле? Где-то я слышал, что она больше 65536 байт не выделяет
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    тогда мб всетаки lea?

    Куча предназначена для малых выделений памяти, меньше страницы-двух. Для больших выделений нужно напрямую выделять нужное число страниц через VirtualAlloc
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Great
    А можно поинтересоваться, почему?
     
  19. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    VirtualAlloc начиная с 10Мб проявляет эффективность, иначе Heap рулит.
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    asmfan
    Почему? Если я себе например создам кучу в гигабайт (возможно чуть больше, чтобы последующее выделение 100-процентно завершилось удачно) и выделю в ней память на гигабайт... попользовался, уничтожил кучу. Чем здесь эффективность ниже, чем при использовании VirtualAlloc? Ясно дело, если намеренно пытаться фрагментировать кучу бесконечными выделениями/освобождениями, то эффективность упадет, но на вышеприведенный пример это ведь не распространяется?