使用SHA1MSG1指令触发Illegal Instruction错误的技术求助
Hey there, let's break down why your sha1msg1 %xmm14, %xmm13 instruction is throwing an illegal instruction error, even though it compiles fine:
1. First, check if your CPU supports SSSE3
SHA1MSG1 is part of the SSSE3 (Supplemental Streaming SIMD Extensions 3) instruction set—this isn't supported on all CPUs, especially older models. To verify your hardware compatibility:
- On Linux, run this command in your terminal:
If you seecat /proc/cpuinfo | grep ssse3ssse3in the output, your CPU has the necessary support. If not, that's the root cause—your hardware can't run this instruction at all.
2. You must enable SSSE3 during compilation
Even if your CPU supports SSSE3, most compilers don't enable this instruction set by default. When compiling your AT&T assembly code with GCC, you need to add the -mssse3 flag to tell the compiler to generate code compatible with SSSE3. Alternatively, use -march=native to let the compiler auto-detect and enable all instruction sets your CPU supports.
Example compile commands:
# Explicitly enable SSSE3 gcc your_assembly_file.s -o your_program -mssse3 # Auto-detect all supported instruction sets gcc your_assembly_file.s -o your_program -march=native
3. Double-check your instruction syntax (though it looks correct)
Your AT&T syntax sha1msg1 %xmm14, %xmm13 is technically valid—SHA1MSG1 expects two 128-bit XMM registers (source and destination). A couple of quick sanity checks here:
- Ensure you're not accidentally using 64-bit MMX registers instead of XMM registers (you're using xmm13/xmm14, so this isn't an issue here).
- While this instruction is designed to be part of a full SHA-1 message expansion sequence (paired with SHA1MSG2, SHA1RNDS4, etc.), using it alone shouldn't trigger an illegal instruction. So this isn't likely the source of your error.
4. Verify the generated machine code in IDA
When debugging with IDA Pro, you can check the machine code for the SHA1MSG1 instruction—it should be 0F 38 C8 /r. If the machine code doesn't match, that means the compiler didn't generate the correct instruction, which circles back to needing to enable SSSE3 in your compile flags.
内容的提问来源于stack exchange,提问作者masec

