郁闷阿,esp check failure

zZing 2003-08-16 06:02:05
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.

内嵌汇编的程序。调试过程中遇到上述问题,不知道如何解决,现请教各位
谢谢!
...全文
37 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zZing 2003-08-17
  • 打赏
  • 举报
回复
Re W32API:

谢谢~~~以后还请多指教

结帖
W32API 2003-08-17
  • 打赏
  • 举报
回复
TO:zZing(zZing)
这跟调用规则有关,
int SameSignFloatAdd( DWORD a, DWORD b, DWORD* dwResult)
是标准的 C 函数,你先看 C 函数的参数传送规则。

你可以试试自己在调用后清理看是否还是有问题,这样就知道是怎么回事了
W32API 2003-08-16
  • 打赏
  • 举报
回复
调查参数传递是否正确,以及过程结束时堆栈是否对齐
紫郢剑侠 2003-08-16
  • 打赏
  • 举报
回复
可能是参数传递约定出了问题.最好把有关代码贴出来才好分析.
zZing 2003-08-16
  • 打赏
  • 举报
回复
Re W32API(李诚):

调用习惯上没有问题
我改成了call之后要pop就没有错误了,请问这是为什么阿。
push ecx;
push ebx;
push eax;
堆栈中的数据在SameSignFloatSub中没有被弹出吗?
W32API 2003-08-16
  • 打赏
  • 举报
回复
你可以试着改成这样
push ecx;
push ebx;
push eax;
call SameSignFloatSub;
pop ecx;
pop ebx;
pop eax;
W32API 2003-08-16
  • 打赏
  • 举报
回复
是否调用习惯上出了问题。

int SameSignFloatAdd( DWORD a, DWORD b, DWORD* dwResult)
函数定义的参数传送规范以及堆栈清理与

push ecx;
push ebx;
push eax;
call SameSignFloatSub
函数调用的参数传递以及堆栈清理对应??

push ecx;
push ebx;
push eax;
call SameSignFloatSub
调用要求被调用过程弹出通过堆栈传递的调用参数
而被调函数
int SameSignFloatAdd( DWORD a, DWORD b, DWORD* dwResult)
是否执行了堆栈的清理??


请你先查一下
int SameSignFloatAdd( DWORD a, DWORD b, DWORD* dwResult)
函数定义的调用规则
zZing 2003-08-16
  • 打赏
  • 举报
回复
写错了,使fpAdd要结束的时候出错
zZing 2003-08-16
  • 打赏
  • 举报
回复
unsigned fpAdd( char *Operand1, char *Operand2)
{
...........
_asm
{
.................
mov eax, op1;
mov ebx, op2;
xor ebx, 0x80000000;
lea ecx, result;
push ecx;
push ebx;
push eax;
call SameSignFloatSub;
cmp eax, 0x00000000;
jnz subnoerror;
call error;
subnoerror:
}
return result;
}



int SameSignFloatAdd( DWORD a, DWORD b, DWORD* dwResult)
{
int result;
DWORD op1 = a & 0x007fffff | 0x00800000; // 取得底数
DWORD op2 = b & 0x007fffff | 0x00800000;
DWORD sign = a & 0x80000000; // 取得符号位
DWORD rank1 = (a & 0x7f800000) >> 23; // 取得阶数
DWORD rank2 = (b & 0x7f800000) >> 23;

_asm
{
mov edx, rank1;
// 对阶
mov eax, rank1;
mov ebx, rank2;
sub eax, ebx;
mov ebx, op2;
mov cl, al;
sar ebx, cl;
mov op2, ebx;

// 相加
mov eax, op1;
mov ebx, op2;
add eax, ebx;
test eax, 0x01000000; // 是否产生进位
jnz Carry;
jmp Combine;

Carry:
inc edx; // 将指数加1
sar eax, 1; // 结果右移一位

Combine:
// 判断是否溢出
cmp edx, 0x00000000;
jbe FAILED;
cmp edx, 0xff;
jnbe FAILED;

and eax, 0xff7fffff;
mov cl, 23;
sal edx, cl;
or eax, edx;
mov ebx, sign;
or eax, ebx;
mov result, eax;
}
*dwResult=result;
return 1;

FAILED:
return 0;
}


void main()
{
fpAdd( "-12.23", "0.000023" );
}
代码大致就是这样,请指教
调试是出错是在function1()要结束的时候

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧