Добавление более четырех параметров в сборке

У меня есть файл 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). Что не так с моим кодом?

4

Решение

Вам не нужно сохранять место для вашего стекового фрейма, если вы не делаете соглашение о вызовах , быстрый вызов допускает только 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

Другие решения

rsp + 20h не указывает на область параметров. Вы сами вначале вычитаете 30h из rsp, не зная почему — почему вы ожидаете, что параметры проталкивания будут в этой области? Они ниже рамки.

Напомним, что при входе в процедуру обратный адрес занимает 8 байт при rsp. Ниже приведены два заданных параметра — rsp + 8 и rsp + 0ch. Если вы уменьшите rsp еще на 30 ч, они будут на rsp + 38 ч, rsc + 3 ч.

2

Есть проблема с вашим кадр стека вам нужно это сначала исправить 🙂
но у меня есть решение для вас, попробуйте это

#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

он также суммирует числа, но на этот раз из массива
Надеюсь, поможет

1
По вопросам рекламы [email protected]