Я пытался построить функцию в ассемблере (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
На 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