2012-04-09 44 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