The code all worked fine, but then I added directives to create unwinding data, and YASM started refusing to assemble my code.
The build settings are for x64, as proven by “-f x64” in the auto-generated command line: "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\"vsyasm.exe -Xvc -f x64 -o "x64\Debug\\" -l "" -P "" --mapdir= "" -E "" --prefix "" --suffix "" -rnasm -pnasm -m amd64
Normally the -m switch isn’t in there, but I added it for good measure. That didn’t help.
Changing the argument of the -f switch to win64 doesn’t help either: "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\"vsyasm.exe -Xvc -f win64 -o "x64\Debug\\" -l "" -P "" --mapdir= "" -E "" --prefix "" --suffix "" -rnasm -pnasm -m amd64
In this code,
bits 64
global s24_fl32_sse2_win64
s24_fl32_sse2_win64:
proc_frame s24_fl32_sse2_win64
sub rsp, 8 + 4 * 16
[alloc_stack 8 + 4 * 16]
movdqa [rsp], xmm6
[save_xmm128 xmm6, 0]
[endprolog]
VSYASM complains about a redefinition of the function label, which probably means that it didn’t recognize proc_frame as a directive. It also says error: unrecognized directive 'alloc_stack' and the same for save_xmm128. It doesn’t complain about endprolog.
Putting the proc_frame in brackets makes the first error go away (the label re-definition), but the manual says to use it without brackets, and it doesn’t solve the problem anyway.
How do I fix this? Preferably in a way that creates proper unwind data.
I think
PROC_FRAMEdefines the label, so you don’t need thes24_fl32_sse2_win64:line – also a few examples I’ve seen putglobal s24_fl32_sse2_win64after thePROC_FRAME– I’m not sure whether this is required or not.In addition –
alloc_stackandsave_xmm128(without square brackets) are macros (they handle both the stack operation itself and the related unwind primitive) – the unwind primitive versions of these are[allocstack ....]and[savexmm128....].