x86程序集中的操作数大小冲突

时间:2012-04-09 07:26:55

标签: c assembly x86

我刚刚开始为我的计算机组织课程编程,每当我尝试在C程序中编译这个operand size conflict块时,我都会收到asm错误。

arrayOfLetters[]对象是一个char数组,所以每个元素不应该是一个字节吗?我执行mov eax, arrayOfLetters[1]时代码有效,但我不确定为什么会有效,因为eax寄存器是4个字节。

#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;
}

1 个答案:

答案 0 :(得分:3)

使用mov al, BYTE PTR arrayOfLetters[1]

您可以使用cl input.c /Faoutput.asm使用MSVC编译代码以获取程序集打印输出 - 这表明只需使用arrayOfLetters[1]转换为DWORD PTR,您需要明确说明您想要{ {1}}。