fastcall как использовать для более чем 4 параметров

Я пытался построить функцию в ассемблере (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 и т. Д., Но это тоже не работает. как я могу вызвать более 4 параметров с помощью fastcall на x64? также я должен освободить место в стеке? Я видел, что некоторые люди должны добавить add rsp,20h прямо перед кодом разлива. Я попробовал это, и это не помогло инкрустированному операнду. Спасибо

Обновить

поэкспериментировав с ним немного, я обнаружил, что единственный способ, которым он работает, - это пролить первые 4 параметра, а затем игнорировать оставшуюся 5-бесконечность

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 ответ

На x86/x64-CPU следующие инструкции не существуют:

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

Обходной путь с использованием rax-регистра для чтения и для записи значений из и в область памяти:

mov rax,[rsp+8*4]
mov [buffer3],rax
mov rax,[rsp+8*5]
mov [startposition],rax
mov rax,[rsp+8*6]
mov [length],rax
Другие вопросы по тегам