1

私はVC++2010でインラインアセンブリを作成して、バイトのRGBバッファをバイトのRGBAバッファにアンパックしようとしています。これが私が思いついたものです。

しかし、私はエラーを受け取ります

1>c:\users\tom\documents\visual studio 2010\projects\source\engine\image_load.c(28):     error C2414: illegal number of operands
1>c:\users\tom\documents\visual studio 2010\projects\source\engine\image_load.c(28):     error C2400: inline assembler syntax error in 'first operand'; found ':'
1>c:\users\tom\documents\visual studio 2010\projects\source\engine\image_load.c(29):     error C2400: inline assembler syntax error in 'opcode'; found ':'
1>c:\users\tom\documents\visual studio 2010\projects\source\engine\image_load.c(29):     warning C4405: 'MOV' : identifier is reserved word
1>c:\users\tom\documents\visual studio 2010\projects\source\engine\image_load.c(30):     error C2415: improper operand type
1>c:\users\tom\documents\visual studio 2010\projects\source\engine\image_load.c(31):     error C2415: improper operand type
1>c:\users\tom\documents\visual studio 2010\projects\source\engine\image_load.c(37): warning C4405: 'loop' : identifier is reserved word
1>c:\users\tom\documents\visual studio 2010\projects\source\engine\image_load.c(71): warning C4018: '<' : signed/unsigned mismatch

何が問題なのかよくわかりません。これが私のコードです。

void RGBtoRGBA (byte *rgba, const byte *rgb, int pixelCount) {
    __asm { 
        MOV EDX, pixelCount
        MOV EBX, rgba
        MOV ECX, rgb
        loop:
            MOV [EBX], ECX
            MOV [EBX+1], [ECX+1]
            MOV [EBX+2], [ECX+2] 
            MOV [EBX+3], 255
            ADD EBX, 4
            ADD ECX, 3
            DEC EDX
            JNZ loop
    }
}

私を許してください、私はアセンブリに不慣れです:(

4

1 に答える 1

3

次のように、2つのメモリオペランドをサポートする汎用命令はありません。

MOV [EBX+1], [ECX+1]
MOV [EBX+2], [ECX+2] 

汎用命令は通常、次の2つのオペランドの組み合わせのみを持つことができます。

  • レジスタ+定数
  • レジスタ+メモリ
  • レジスター+レジスター
  • メモリ+定数

有効なオペランドの組み合わせを使用するには、コードを書き直す必要があります。指示の詳細については、CPUのマニュアルを読み始めてください。

また、loop命令名です。ラベル名には使用しないでください。

于 2012-08-11T06:53:14.227 に答える