ассемблер x86, странное поведение add и sub - PullRequest
0 голосов
/ 10 декабря 2011

У меня есть этот кусок кода:

openFileToRead:
sub sp,4
add sp,4
ret

, тогда у меня есть в моем коде

call openFileToRead

И теперь у нас проблема.Все работает, когда есть саб перед добавлением, но когда я меняю саб с добавлением, как здесь:

openFileToRead:
add sp,4
sub sp,4
ret

весь ад выпадает.В ответ он прыгает в какое-то странное место и память.Между этими двумя метками не должно быть никакой разницы, но есть.Почему это так?

Я компилирую с masm на Windows XP с процессором Intel, я использую 16-битный компоновщик.

Ответы [ 3 ]

3 голосов
/ 10 декабря 2011

Вы никогда не должны иметь add на указатель стека до sub, так же, как вы никогда не должны иметь pop до push.

Когда вы add в стеке, вы в основном говорите, что все, что находится по адресу, меньшему, чем тот, на который указывает указатель стека, является свободной памятью для использования. Когда вы sub из стека - это когда вы по существу выделяете память. Указатель стека начинается с большого объема памяти и перемещается к низкому объему памяти, когда объекты помещаются в стек.

В комментарии выше у Ганса есть точка с прерываниями. Если что-нибудь получит контроль после add и использует стек , он перезапишет ваш обратный адрес. Это потому, что вы в основном «освободили» его, добавив к указателю стека.

3 голосов
/ 10 декабря 2011

Возможно, что прерывание - скажем, тактовый такт - обслуживается сразу после того, как вы добавили sp 4, забивая ваше возвращаемое значение, которое в данный момент оказывается в неиспользуемой области стека (ниже указателя стека).

1 голос
/ 10 декабря 2011

Я собираюсь догадаться, что это проблема многопоточности / прерывания - измените стек, поток произойдет, вернитесь и бум.Служит вам писать для игры с указателем стека следующим образом:)

...