Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.asm.x86    |    Ahh, the lost art of x86 assembly    |    4,675 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 2,972 of 4,675    |
|    Alex to Rick C. Hodgin    |
|    Re: 64 bit stack alignment    |
|    29 Aug 17 19:39:44    |
      From: alex@nospicedham.rivadpm.com              On 29-Aug-17 18:56, Rick C. Hodgin wrote:       > On Tuesday, August 29, 2017 at 1:14:49 PM UTC-4, Alex wrote:       >> On 29-Aug-17 17:07, Rick C. Hodgin wrote:       >>> On Tuesday, August 29, 2017 at 11:14:38 AM UTC-4, Alex wrote:       >>>> On 64 bit Windows, stack alignment on a 16 byte boundary is required       >>>> before calling all except a leaf function. In the called function, the       >>>> stack is 8 mod 16.       >>>>       >>>> Now, I'm struggling to come up with a way of doing it beyond this code       >>>> (which I didn't invent, but I can't for the life of me remember where I       >>>> found it.)       >>>>       >>>> push rsp       >>>> push [rsp]       >>>> and spl $F0       >>>> call funkychicken       >>>> pop rsp       >>>>       >>>> It seems to be the only way of doing this without branches, flags or       >>>> other expensive nonsense. But, as ever, there may be a better way. Any       >>>> suggestions?       >>>       >>> I don't think the above solution will work. If I read it correctly       >>> (as it appears to be mixing ISAs), you'll lose your relative stack       >>> pointer position with the AND, and since it's an unknown (it will       >>> either change the value of rsp or not), then it won't be reliable.       >>       >> It does. Either the AND doesn't change RSP and we pop the second copy,       >> or it does and we pop the first.       >>       >> If I'm passing parameters beyond 4, then that needs parameters pushed on       >> the stack. An even number can use AND SPL $F0 and an odd number OR SPL       >> $08 as in       >>       >> push rsp       >> push [rsp]       >> and spl $F0 ; align to 16       >> push r14 ; two extra parameters = 16       >> push r15       >> call funkychicken       >> add rsp $8       >> pop rsp       >>       >> or       >>       >> push rsp       >> push [rsp]       >> or spl $08 ; align to 8 byte       >> push r15 ; one extra parameter       >> call funkychicken       >> add rsp $4       >> pop rsp       >       > #1 -- That will change the value of the stack pointer, but you       > don't know if it changed or not. If it was already aligned,       > it would've done nothing, but if it wasn't aligned, it       > would've adjusted it. And when you return, you'll be at a       > point of not knowing whether or not it should be adjusted.       > Your subsequent pop rsp will be off by 8 bytes potentially.              That's why there are two identical values on the stack provided by the       pushes of RSP and [RSP] (which is RSP at the point of the first push).              >       > #2 -- What is "spl"?              The low order byte of RSP. It's key to understanding why it works.       Anyhow, I'm looking for an alternative, and might use the register version.                     --       Alex              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca