【问题标题】:fastcall how to use for more than 4 parametersfastcall如何使用超过4个参数
【发布时间】:2014-07-15 06:28:07
【问题描述】:

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

【问题讨论】:

  • 你不能使用 mov 从一个指针移动到另一个指针,你需要先加载到寄存器中。

标签: c++ assembly call fasm fastcall


【解决方案1】:

在 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

【讨论】:

  • 我以前试过这个,但它不起作用。它可以编译,但是当我运行该函数时,它会给我一个 APPCRASH
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多