我有C ++文件和.asm文件,如下所示。我试图添加我在求和函数中传递的所有参数
summation(int a ,int b ,int c ,int d, int e,int f)
c ++文件如下所示:
#include <iostream>
#include <conio.h>
#include<stdlib.h>
using namespace std;
extern "C" int summation(int a ,int b ,int c ,int d, int e,int f);
int main(){
cout << "Summation : "<<summation(1,2,7,1,8,10)<<endl;
return 0;
}
asm文件看起来像这样:
.code
summation proc
sub rsp,30h
mov eax,ecx
add eax,edx
add eax,r8d
add eax,r9d
add eax,dword ptr [rsp+20h]
add eax,dword ptr [rsp+28h]
add rsp,30h
ret
summation endp
end
拥有这些代码的结果总是22(应该是29)。我的代码出了什么问题?
答案 0 :(得分:2)
rsp + 20h未指向参数区域。你自己开始从rsp中减去30h,不知道为什么 - 你为什么期望推送参数在那个区域内?他们低于框架。
回顾一下:在程序入口处,返回地址在rsp处占用8个字节。在此之下,有两个推送参数 - 在rsp + 8和rsp + 0ch。如果你将rsp减少30h,那么它们在rsp + 38h,rsc + 3ch。
答案 1 :(得分:2)
除非您正在执行calling convention,否则不需要为堆栈帧保留空间,快速调用仅允许4个参数,尝试使用RSP直接使用堆栈,
summation proc
mov eax,ecx
add eax,edx
add eax,ebx
add eax,r8d
add eax,r9d
add eax,[rsp+50o]
add eax,[rsp+60o]
ret
summation endp
我使用十八进制,你可以使用小数,如果你喜欢
答案 2 :(得分:1)
您的stack Frame存在问题,需要先修复它:) 但我有一个解决方案,试试这个
#include <iostream>
#include <conio.h>
using namespace std;
extern "C" int sum2(int *i,int a);
int main()
{
int i2[10] = {1,2,3,4,5,10,20,30,40,50};
cout << "The Sum is using Array : "<< sum2 (i2,10)<<endl;
_getch();
return 0;
}
你的asm.asm中的把这个
sum2 proc
;{1,2,3,4,5,10,20,30,40,50}; //165
mov rax,0 ;Initialize it to zero
mov rbx,rdx
adding:
add rax,[rcx]
add rcx,4
dec rbx
jnz adding;
finish:
ret
sum2 endp
它也会对数字求和,但这次是从数组中得出的 希望它有所帮助