2012-04-09 6 views
1

Ich habe gerade begonnen zu programmieren in Assembly für meine Computerorganisation natürlich, und ich bekomme immer eine operand size conflict Fehler, wenn ich versuche, diese asm Block in einem C-Programm zu kompilieren.Operand Größe Konflikt in x86 Assembly

Das Objekt arrayOfLetters[] ist ein Char-Array, sollte also nicht jedes Element ein Byte sein? Der Code funktioniert, wenn ich mov eax, arrayOfLetters[1] mache, aber ich bin mir nicht sicher, warum das funktioniert, da das eax Register 4 Bytes ist.

#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

Können Sie den umgebenden C-Code anzeigen? – DCoder

+0

@DCoder Ich habe es zur Frage hinzugefügt, danke! –

+0

Wenn Sie 'mov' verwenden, bewegen Sie ein Wort in das Zielregister, die Breite von' al' ist jedoch nur ein Byte. Sie sollten stattdessen "Movb" IMO verwenden. Entschuldigung, ich kann deinen Code nicht debuggen, weil ich keinen Assembler mit Intel-Stil zur Hand habe. BTW, du meinst "mov al, arrayOfLetters [1]" funktioniert oder kann nur kompilieren? –

Antwort

3

Verwenden Sie mov al, BYTE PTR arrayOfLetters[1].

Sie können den Code mit MSVC kompilieren cl input.c /Faoutput.asm unter Verwendung eines Montage Ausdruck zu bekommen - dies, dass einfach mit arrayOfLetters[1] übersetzt DWORD PTR zeigen würde, und Sie müssen explicity Sie BYTE PTR wollen angeben.

Verwandte Themen