2015-10-22 6 views
0

Я потратил много времени, пытаясь решить эту проблему, и я не понимаю, почему это не работает. Описание проблемы находится в комментариях ниже:Регистрация ESI вызывает ошибку RunTime-Check Failure # 0

.386 
.MODEL FLAT, STDCALL 

OPTION CASEMAP:NONE 
.NOLIST 
.NOCREF 
INCLUDE \masm32\include\windows.inc 
.LIST 

.CODE 
DllEntry PROC hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD 
mov eax, TRUE 
ret 
DllEntry ENDP 

caesarAsm proc string: DWORD, key: DWORD, stringLength : DWORD 

     mov esi, 1 ; I cannot use this register, mov esi, (anything) causes Crash: 
     ; Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention 
     mov eax, string 
     ret 
caesarAsm endp 
END DllEntry

Я искал «целый» Интернет, я обнаружил, что проблема связана со стеком, но ни одна операция на штабеля не помог мне решить. Я использую Microsoft Visual Studio 2012

+0

https://en.wikipedia.org/wiki/X86_calling_conventions#Register_preservation –

ответ

1

Я предполагаю, что ошибка не возникает в этой функции, скорее, она запускается в другом месте. Регистр esi является регистром, зарегистрированным пользователем. Вы должны убедиться, что его значение одинаково при выходе функции, как это было при входе. Вы можете использовать его в своей функции, но вы должны сохранить и восстановить его значение. Такие как:

push esi 
    mov esi, 1 
    mov eax, string 
    pop esi 
    ret 

Все это хорошо документировано. Вы можете использовать только eax, ecx и edx без сохранения.

Примечание: вы используете высокоуровневые функции вашего ассемблера, вы можете проверить фактический сгенерированный код или воздержаться от их использования до тех пор, пока не будете уверены в том, какой результат будет. Кстати, masm имеет ключевое слово USES, которое будет делать сохранение/восстановление для вас.

 Смежные вопросы

  • Нет связанных вопросов^_^