1

我正在使用 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 中。

4

1 回答 1

0
movq %rbx, %mm0 

试一试movd

不要忘记,如果您只需要 5 位,您可以使用 1 字节的进位标志

shr $5, %rax 10111

将设置进位

shr $5, %rax  01110

将不会

于 2013-05-18T17:00:34.967 回答