2012-04-09 69 views
1

我刚刚开始在我的计算机组织课程中使用Assembly进行编程,每当我尝试在C程序中编译此asm块时,我都会收到operand size conflict错误。x86程序集中的操作数大小冲突

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; 
} 
+0

你能显示周围的C代码吗? – DCoder 2012-04-09 07:28:05

+0

@DCoder我将它添加到问题,谢谢! – 2012-04-09 07:42:22

+0

当你使用'mov'将一个字移动到目标寄存器时,'al'的宽度只有一个字节。您应该使用'movb'代替IMO。抱歉,无法调试您的代码,casue我没有英特尔风格的汇编程序。顺便说一句,你的意思是'mov al,arrayOfLetters [1]'起作用或者只是可以编译? – 2012-04-09 07:48:16

回答

3

使用mov al, BYTE PTR arrayOfLetters[1]

你可以编译使用cl input.c /Faoutput.asm得到一个装配打印输出MSVC的代码 - 这将表明,单纯用arrayOfLetters[1]转化为DWORD PTR,你需要明确地规定你想BYTE PTR