GAS,MOVQ尝试将rax复制到mmx寄存器时,引发操作数不匹配

时间:2013-05-18 16:22:39

标签: assembly gnu mmx

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

1 个答案:

答案 0 :(得分:0)

movq %rbx, %mm0 

movd一个去吗?

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

shr $5, %rax 10111

将设置进位

shr $5, %rax  01110

不会