题目要求是在C中输入两个数,调用汇编子程序进行相乘并把结果返回到主程序。由于考虑汇编imul的结果是分别放在两个32位寄存器当中所以返回值的处理有点麻烦,下边是我的程序,求大侠们帮助下找下错在哪,很急,很感谢,真心感谢
在线等,诚心求教,感谢各位!
------最佳解决方案--------------------------------------------------------
esp已经变成了0,进行push操作的时候访问违例。
并且还有其他的问题,我简单的改了一下,改的不好,你试试吧。
#include <stdio.h>
__int64 product(long a, long b);
int main()
{
long a, b;
__int64 p;
printf("please input a number:");
scanf("%ld", &a);
printf("please input an other:");
scanf("%ld", &b);
p = product(a, b);
printf("The result: %ld * %ld = %I64d\r\n", a, b, p);
return 0;
}
__int64 product(long a, long b)
{
__int64 *temp;
__int64 nNum;
__asm
{
pushad
mov eax, a
mov ebx, b
imul ebx
mov [temp - 4], edx
mov [temp - 8], eax
popad
}
return nNum;
}
定义__int64是为了防止发生溢出的。
------其他解决方案--------------------------------------------------------
我初步看了一下,你的main函数里面的那个最后一个printf语句,p的输出有问题,不应该是 &
后面的栈指针esp 在开始的时候执行这一条指令,所以后面就不能正常显示结果,屏蔽掉这一句就行了我修改了源码:
#include <stdio.h>
#include <stdlib.h>
long product(long a,long b);
int main()
{
long a,b,*p = NULL;
printf("Please input a number:\n");
scanf("%ld",&a);
printf("Please input another number\n");
scanf("%ld",&b);
product(a,b);
}
long product(long a,long b)
{
long temp;
__asm{
xor edx,edx
// mov esp,edx
mov eax,a
mov ebx,b
imul ebx
push eax
push ebx
mov temp,ebx
pop edx
pop eax
}
printf("+_+_+_+\n");
printf("the result: %ld x %ld = %ld\n",a,b,temp);
return temp;
}
------其他解决方案--------------------------------------------------------
经过测试,1楼正解。
------其他解决方案--------------------------------------------------------
[quote=引用:]
esp已经变成了0,进行push操作的时候访问违例。
并且还有其他的问题,我简单的改了一下,改的不好,你试试吧。
懂了,谢谢!