Zugriff mittels Inline assembler auf char array?



  • Hey @all,

    ich versuche mich gerade einem projekt (c++ und inline assembler) in vc++

    Auf variablen zugreifen ist kein problem, nur wie greife ich auf ein char array zu? oder allgemein auf arrays?

    Beispiel:

    char test_array[5] = {'a', 'b', 'c', 'd', 'e'};
    
    __asm {
        mov eax, test_array[3]        // Funktioniert nicht
    }
    

    Wie könnte ich sowas lösen?

    Vielen Dank im Voraus
    Lg _freeze_



  • mov al, test_array[3]
    🙂



  • Was ist da der Unterschied?

    Dachte in einer 32 Bit-Umgebenung gelten die Register EAX, EBX, ECX, EDX?

    lg _freeze_



  • Also wenn ich es so mache, dann bekomme ich folgende fehlermeldung

    error C2443: operand size conflict
    
    add ecx, digstr[edx]	// Ergibt digstr[10] ==> D
    

    Im Endeffekt sollte dann sowas in die Richtung rauskommen

    ECX => "DAS"

    Er soll immer einen Buchstaben aus dem Array zum Register ECX hinzufügen und dann das ganze am Ende in einen std::string packen:

    std::string text = "";
    __asm {
        add ecx, digstr[edx]	// Ergibt digstr[10] ==> D
    .
    .
    .
        mov text, ecx
    

    lg _freeze_



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • freeze schrieb:

    Was ist da der Unterschied?

    falscher datentyp (char-->long)

    freeze schrieb:

    Dachte in einer 32 Bit-Umgebenung gelten die Register EAX, EBX, ECX, EDX?

    nö, die kann man noch aufteilen wie beim 16-bittigen x86...

    btw: wieso nimmste asm für sowas?
    der C-compiler kann das genau so gut und weniger fehleranfällig.



  • OK ich habs jetzt so probiert, der fehler ist weg, jedoch schreibt er nix in die variable "text"

    std::string text = "";
    __asm {
    .
    .
    .
    	mov al, digstr[edx]
    	mov retval, al
    .
    .
    .
        mov text, ecx
    

    jedoch steht nix in text drinnen => die variable text bleibt leer 😞

    lg _freeze_



  • freeze schrieb:

    Hey @all,

    ich versuche mich gerade einem projekt (c++ und inline assembler) in vc++

    Auf variablen zugreifen ist kein problem, nur wie greife ich auf ein char array zu? oder allgemein auf arrays?

    Beispiel:

    char test_array[5] = {'a', 'b', 'c', 'd', 'e'};
    
    __asm {
        mov eax, test_array[3]        // Funktioniert nicht
    }
    

    Wie könnte ich sowas lösen?

    Vielen Dank im Voraus
    Lg _freeze_

    char global_array[5] = {'a', 'b', 'c', 'd', 'e'}; 
    
    int main()
    {
    char local_array[5] = {'a', 'b', 'c', 'd', 'e'}; 
    
        _asm
        {
            mov eax, offset global_array[3]
            // oder
            lea eax, global_array[3]
    
            //mov eax, offset local_array[3] Fehler! lokale Variable liegen auf
            //                               dem Stack (Adressierung über [ebp] also lea nehmen!)
            lea eax, local_array[3]   // Ok!
            //Test
            mov cl, [eax]
            // cl == 'd'
            mov byte ptr [eax], 'A'  // local_array[] == {'a', 'b', 'c', 'A', 'e'}; 
        }
    }
    

    mfg



  • freeze schrieb:

    OK ich habs jetzt so probiert, der fehler ist weg, jedoch schreibt er nix in die variable "text"

    std::string text = "";
    __asm {
    .
    .
    .
    	mov al, digstr[edx]
    	mov retval, al
    .
    .
    .
        mov text, ecx
    

    jedoch steht nix in text drinnen => die variable text bleibt leer 😞

    das funzt so nicht.
    damit überschreibst du irgendwelche internen variablen in dem std::string.
    du könntest vielleicht 'ne memberfunction des strings aufrufen (push_back oder sowas)...
    aber warum asm dafür 😕


Anmelden zum Antworten