Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly GAS,MOVQ在尝试将rax复制到mmx寄存器时引发操作数不匹配_Assembly_Gnu_Mmx - Fatal编程技术网

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

Assembly GAS,MOVQ在尝试将rax复制到mmx寄存器时引发操作数不匹配,assembly,gnu,mmx,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"

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

movq %rbx, %mm0 
试一试
movd

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

shr $5, %rax 10111
将设置进位

shr $5, %rax  01110

将不会

如何按您的意思使用此标志?谢谢,这是一个很好的选择。我试过移动,试过推堆栈。仍然不匹配。。。