2013-12-10 25 views
4

添加四個以上的PARAMS我有C++文件和文件.ASM如圖所示below.Am嘗試添加所有PARAMS我在求和函數傳遞在大會

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)。我的代碼有什麼問題?

+2

你使用,你可以使用十進制fastcall,它不會處理超過4個。其餘的被壓入堆棧。 – ScarletAmaranth

+0

所以我怎麼處理他們(推入堆棧)? @ScarletAmaranth – 105tNoMatter

+0

爲什麼不讓一個64位C編譯器告訴你答案? –

回答

2

你不需要爲你保留空間[R堆棧幀,除非你正在做一個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 

我用octadecimal如果你喜歡

2

rsp + 20h不指向參數區域。你自己一開始就從rsp減去30h,不知道爲什麼 - 你爲什麼期望推動參數在該區域內?他們在框架下面。

回顧一下:在程序入口處,返回地址在rsp上佔用8個字節。在那之下,有兩個推送參數 - 在rsp + 8和rsp + 0ch。如果你再減少rsp 30小時,他們在rsp + 38h,rsc + 3ch。

+0

啊我犯了錯誤..從我寫的「dword ptr [rsp + 20h]」和「dword ptr [rsp + 20h]」不能保留其餘兩個數字。但我不知道如何將它們推送到堆棧..如果你發現一個解決方案,你可以寫我的asm文件的整個版本.. @ Seva Alekseyev – 105tNoMatter

+0

C代碼將他們推到堆棧,同時執行調用。彙編程序只需要知道棧上的哪個位置就可以找到它們。 –

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 

它也總結數字,但這次從一個數組 希望它可以幫助