在Assembly中添加四个以上的参数

时间:2013-12-10 17:35:03

标签: c++ assembly masm

我有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)。我的代码出了什么问题?

3 个答案:

答案 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

它也会对数字求和,但这次是从数组中得出的 希望它有所帮助