我正在使用 gnu 程序集和 gcc 编译器。我必须使用 mmx 寄存器进行一些操作。我有一个字节的内存缓冲区,我正在从内存中读取 1 个字节到 %al,进行逻辑和操作并将 rax 左移 1 个字节并从内存中插入下一个字节的低位,直到 %rax 已满。然后当我尝试这样做时:
movq %rax, %mm0
编译器抛出:错误:“movq”的操作数类型不匹配
例子:
这有效:
mov $0, %rcx\n"
movl , %ecx\n"
mov (%1, %rcx, 8), %rbx\n"
movq %rbx, %mm0
这不:
mov (variable_that_contains_address, %rcx, 4), %rax ;get 4 bits from memory
movb %al, %bl
andb $0b00011111, %bl ;only lower 5 bits needed
movb %bl, %dl ;store whole byte at rdx
shl $8, %rdx ;make space for next byte
shr $5, %rax ; I need next 5 bits, because data in memory are saved not in bytes
movb %al, %bl ;next 5 bits
;repating until rdx is full (some higher bits unused)
movq %rdx, %mm0 ; and now compiler throws mismatch error
此代码不是完整代码 - 完整代码很长。它是为您的直觉而设计的。
为什么它那么讨厌我?我做错了什么。请不要抱怨获取这 5 位的方法,我只需要帮助将 rdx 存储到 mm0 中。