Работа со стеком

Тема в разделе "WASM.ASSEMBLER", создана пользователем mix_mix, 24 мар 2006.

  1. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    После некоторых вычислений у меня в стеке появляется определенное кол-во числел.

    .WHILE edx < ecx

    ... какие-то вычисления ...

    push [edi+4]

    add edi, 20

    ... какие-то вычисления ...

    .ENDW

    Если не вдаваться в подробности, то будет примерно так. Так вот, все замечательно, но мне надо, чтобы в стеке эти переменные находились в обратном порядке (кол-во переменных я знаю). То есть что-нибудь наподобие вот этого:

    mov eax, кол-во

    shl eax, 2 ; <- eax=eax*4

    sub esp, eax

    .WHILE

    ... какие-то вычисления ...

    mov eax, [edi+4]

    mov [esp], eax

    add esp, 4

    add edi, 20

    ... какие-то вычисления ...

    .ENDW

    Но такое почему-то не работает. Подскажите как надо правильно сделать.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Как именно не работает?
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А для чего add esp,4 ? Может ты в конце забываешь вернуть esp обратно

    По идее нужно использовать дополнительный индексный регистр, например ecx:
    Код (Text):
    1. sub esp,eax
    2. xor ecx,ecx
    3. .while
    4. ...
    5. mov [esp+ecx*4],eax
    6. inc ecx
    7. ...
    8. .endw
     
  4. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    leo прав, все я понял суть:

    команда push уменьшает esp на 2 или 4, то есть если выполняется 2 push, то

    esp = 0

    push 1

    push 1

    esp = -8

    А у меня в результате помещений переменных в стек esp равен 0 (грубо говоря, ну вы меня поняли). Вот правильный код:

    mov eax,кол-во переменных

    shl eax,2 ; <- eax=eax*4

    sub esp, eax

    .WHILE ...

    ...

    mov [esp], edx

    add esp, 4

    ...

    .ENDW

    sub esp, eax

    Вот так работает.