1

コンピューター編成コースのアセンブリでプログラミングを開始したばかりですが、Cプログラム内でoperand size conflictこのブロックをコンパイルしようとすると、エラーが発生し続けます。asm

オブジェクトはchar配列なので、arrayOfLetters[]各要素を1バイトにするべきではありませんか?コードは実行すると機能しますが、レジスタが4バイトmov eax, arrayOfLetters[1]であるため、なぜ機能するのかわかりません。eax

#include <stdio.h>
#define SIZE 3

char findMinLetter( char arrayOfLetters[], int arraySize )
{
    char min;

    __asm{
        push eax
        push ebx
        push ecx
        push edx
        mov dl, 0x7f        // initialize DL

        mov al, arrayOfLetters[1] //Problem occurs here

        mov min, dl        // read DL
        pop edx
        pop ecx
        pop ebx
        pop eax
    }

    return min;
}

int main()
{
    char arrayOfLetters[ SIZE ] = {'a','B','c'};

    int i;

    printf("\nThe original array of letters is:\n\n");
    for(i=0; i<SIZE; i++){
        printf("%c ", arrayOfLetters[i]);
    }
    printf("\n\n");

    printf("The smallest (potentially capitalized) letter is: %c\n", findMinLetter( arrayOfLetters, SIZE ));

    return 0;
}
4

1 に答える 1

3

を使用しmov al, BYTE PTR arrayOfLetters[1]ます。

を使用cl input.c /Faoutput.asmしてMSVCでコードをコンパイルし、アセンブリの印刷出力を取得できます。これは、を使用するだけでarrayOfLetters[1]変換が行われることを示してDWORD PTRおり、を明示的に指定する必要がありますBYTE PTR

于 2012-04-09T07:51:03.783 に答える