2013-05-18 20 views
1

我正在使用gnu彙編和gcc編譯器。 我必須使用mmx寄存器進行一些操作。 我有一個字節的內存緩衝區,我正在從內存中讀取1個字節到%al,從而進行邏輯和操作,並將rax左移1個字節,並在內存的下一個字節中插入下一個字節,直到%rax變滿。然後,當我試圖做的事:GAS,MOVQ嘗試將rax複製到mmx寄存器時引發操作數不匹配

movq %rax, %mm0 

編譯器拋出:錯誤:操作數類型不匹配`MOVQ」

例子:

這工作:

mov $0, %rcx\n" 
    movl , %ecx\n" 
    mov (%1, %rcx, 8), %rbx\n" 
    movq %rbx, %mm0 

這唐't:

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
movq %rbx, %mm0 

movd一個去嗎?

不要忘記,如果你只需要5位可以使用進位標誌1個字節

shr $5, %rax 10111 

將設置進

shr $5, %rax 01110 

不會

+0

如何使用這個標誌在你的意思? – Vilo

+0

謝謝,這是一個不錯的選擇。我試過movd,試圖推動堆棧。仍然不匹配... – Vilo

相關問題