fastcall如何使用超过4个参数

时间:2014-05-26 13:04:58

标签: c++ assembly call fasm fastcall

我试图在assebmly(FASM)中构建一个使用4个以上参数的函数。在x86中它工作正常,但我知道在x64中使用fastcall你必须按照rcx,rdx,r8,r9的顺序将参数溢出到阴影空间我读到5等等你必须将它们传递到堆栈,但是我不知道该怎么做。这是我尝试过但它一直说无效操作数。我知道我正在做的前4个参数是正确的,因为我之前已经制作了x64函数,但它是最后3个我不知道如何溢出

proc substr,inputstring,outputstring,buffer1,buffer2,buffer3,startposition,length
;spill
mov [inputstring],rcx
mov [outputstring],rdx
mov [buffer1],r8
mov [buffer2],r9
mov [buffer3],[rsp+8*4]
mov [startposition],[rsp+8*5]
mov [length],[rsp+8*6]

如果我尝试

mov [buffer3],rsp+8*4

它表示该行上有额外的字符。 我也看到有些人使用rsp + 20h,rsp + 28h等,但这也不起作用。 如何在x64上使用fastcall调用4个以上的参数? 我还必须在堆栈上腾出空间吗?我看到有些人必须在他们的溢出代码之前添加rsp,20h。我试过了,它没有帮助invlaid操作数。 感谢

更新

在玩了一会儿之后,我发现它似乎工作的唯一方法是如果我溢出前4个参数然后忽略其余的5-infinity

proc substr,inputstring,outputstring,buffer1,buffer2,buffer3,startposition,length
;spill
mov [inputstring],rcx
mov [outputstring],rdx
mov [buffer1],r8
mov [buffer2],r9

;start the regular code. ignore spilling buffer3,startposition and length 

1 个答案:

答案 0 :(得分:0)

在x86 / x64-CPU上,以下说明不存在:

mov [buffer3],[rsp+8*4]
mov [startposition],[rsp+8*5]
mov [length],[rsp+8*6]

使用rax-register来读取和写入内存中的值的解决方法:

mov rax,[rsp+8*4]
mov [buffer3],rax
mov rax,[rsp+8*5]
mov [startposition],rax
mov rax,[rsp+8*6]
mov [length],rax