На ваш вопрос, кажется, здесь хорошо ответил, но я просто хочу добавить еще один комментарий к этой теме.
Те, кто проектирует базу данных, должны хорошо знать зарезервированные ключевые слова и избегать их использования. Если вы обнаружите, что кто-то использует его, сообщите об этом (вежливо).
«Зарезервированные ключевые слова не должны использоваться в качестве имен объектов. SQL Server может содержать идентификаторы, содержащие слова, не зарезервированные в более ранней версии, но зарезервированные слова для текущей версии SQL Server. Вы можете ссылаться на объект, используя идентификаторы с разделителями, пока имя не будет изменено. " http://msdn.microsoft.com/en-us/library/ms176027.aspx
и
"Если ваша база данных содержит имена, соответствующие зарезервированным ключевым словам, вы должны использовать идентификаторы с разделителями при обращении к этим объектам. Дополнительные сведения см. в разделе Идентификаторы (DMX). " http://msdn.microsoft.com/en-us/library/ms132178.aspx
Проблема заключается в обработке стека. Сначала вы пишете адрес указателя стека (esp) на указатель кадра (ebp), затем вы меняете ebp и переместите его обратно в esp, что приводит к сбою программы. Ваш код должен быть переписан следующим образом:
do_stuff:
push ebp
mov ebp, esp ; for correct debugging
mov eax, 10
add eax, 20
add eax, 30
add eax, 40
add eax, 50
mov esp, ebp ; refresh stack pointer if it was changed
pop ebp ; get pointer to previous frame
ret ; the result will be stored in eax