-1

我试图在 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 
4

1 回答 1

0

在 x86/x64-CPU 上,不存在以下指令:

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

使用 rax-register for 从内存位置读取和写入值的解决方法:

mov rax,[rsp+8*4]
mov [buffer3],rax
mov rax,[rsp+8*5]
mov [startposition],rax
mov rax,[rsp+8*6]
mov [length],rax
于 2014-05-26T13:34:06.257 回答