我正在使用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中。
答案 0 :(得分:0)
movq %rbx, %mm0
给movd
一个去吗?
不要忘记,如果你只需要5位,就可以使用1字节的进位标志
shr $5, %rax 10111
将设置进位
shr $5, %rax 01110
不会