我试图在 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 个参数?我还必须在堆栈上腾出空间吗?我看到有些人必须在他们的溢出代码之前加上 add 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