Multiplication of two binary numbers in fixed point arithmetic
What you have done is taken two signed numbers, and multiplied them together using unsigned arithmetic.  Signed 2's compliment multiply is different.
In a higher-level language like C, C++ or Rust, make sure that your fractional numbers are sign extended into 32-bit signed integers and multiply them, then convert the result.
In assembly language, use the signed multiply instruction -- and if you're using a 32-bit processor and 32-bit data, make sure to sign-extend the numbers when you put them into the argument registers, or the result will be as if you did unsigned arithmetic.