1

コードの一部(元々C ++で記述された関数)を手動で調整しようとすると、アセンブラーが次のエラーをスローします:エラーA2022:命令オペランドは同じサイズである必要があります

'movq'命令を使用する行で。

コード:

.686P       
.mmx          
.xmm           
.MODEL flat, stdcall
.STACK 4096

.data
packedbytes db 10, 20, -30, 40, 50, 60, -70, 80
packedwords dw 10, 20, 30, 40
packeddwords dd 10, 20

.code
main PROC 

    movq mm0, packedbytes   ; <== error thrown here
    movq mm1, packedwords   ; <== here
    movq mm2, packeddwords  ; <== and here

    mov a0, 04d
    mov al, 0d  
    int 21h     
main ENDP
END main

32ビットボックスでmasmを使用しています。

4

1 に答える 1

0

私はそれを理解しました。レジスタを直接使用することはできません。ポインタを介してのみデータを配置できます(少なくともmasmでは)。

    mov edx, offset packedbytes
    movq mm0, [edx] 
    mov edx, offset packedwords
    movq mm1, [edx]
    mov edx, offset packeddwords   
    movq mm2, [edx] 

これでうまくいくはずです。

于 2013-01-03T14:30:01.400 に答える