У меня есть файл 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 параметра, попробуйте использовать стек напрямую, используя 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
Я использовал восьмиугольник, вы можете использовать десятичную, если вы предпочитаете
rsp + 20h не указывает на область параметров. Вы сами вначале вычитаете 30h из rsp, не зная почему — почему вы ожидаете, что параметры проталкивания будут в этой области? Они ниже рамки.
Напомним, что при входе в процедуру обратный адрес занимает 8 байт при rsp. Ниже приведены два заданных параметра — rsp + 8 и rsp + 0ch. Если вы уменьшите rsp еще на 30 ч, они будут на rsp + 38 ч, rsc + 3 ч.
Есть проблема с вашим кадр стека вам нужно это сначала исправить 🙂
но у меня есть решение для вас, попробуйте это
#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
он также суммирует числа, но на этот раз из массива
Надеюсь, поможет