ESP 的值未正确保存
Value of ESP was not properly saved
MASM 代码:
.model flat, stdcall
option prologue:none
option epilogue:none
.code
lockc proc value : dword
mov ecx, [esp+04h]
_loop:
lock bts [ecx], 0
pause
jc _loop
ret
lockc endp
end
C代码:
typedef struct { DWORD l; }lck_t;
extern DWORD __stdcall lockc(lck_t* l);
忽略可能发生的任何错别字,我是手抄的。代码编译正常,但我一直收到 ESP 错误。
我从 2 个线程调用该函数,它总是在第一次执行后向我显示错误,但我不明白为什么会这样。
这个函数使用了stdcall
调用约定,接受一个参数,但是没有释放space参数占用的空间,所以returns之后栈会不平衡(调用者不会调整堆栈来摆脱参数,因为调用一个 stcall
函数不是必需的)。
将 ret
更改为 ret 4
。
MASM 代码:
.model flat, stdcall
option prologue:none
option epilogue:none
.code
lockc proc value : dword
mov ecx, [esp+04h]
_loop:
lock bts [ecx], 0
pause
jc _loop
ret
lockc endp
end
C代码:
typedef struct { DWORD l; }lck_t;
extern DWORD __stdcall lockc(lck_t* l);
忽略可能发生的任何错别字,我是手抄的。代码编译正常,但我一直收到 ESP 错误。
我从 2 个线程调用该函数,它总是在第一次执行后向我显示错误,但我不明白为什么会这样。
这个函数使用了stdcall
调用约定,接受一个参数,但是没有释放space参数占用的空间,所以returns之后栈会不平衡(调用者不会调整堆栈来摆脱参数,因为调用一个 stcall
函数不是必需的)。
将 ret
更改为 ret 4
。