edx in ein char kopieren



  • hallo leute

    probier grad die C-funktion itoa nach zu bauen und will nun den rest der division, der in edx steht in ein char kopieren. derzeit mach ich folgendes:

    a /= 10;
    __asm { mov b, edx; }
    buf[l++] = b;
    

    wie kann ich es anstellen, das ich den wert von edx( immer kleiner 10) gleich in meinen buffer kopieren kann ?

    Meep Meep



  • edx=4Byte, char=1byte. Lösung wäre z.B

    mov b, dl
    


  • hi

    CDW schrieb:

    edx=4Byte, char=1byte. Lösung wäre z.B

    mov b, dl
    

    kann dann aber auch nicht klappen, weil b ein int ist.
    mir gehts darum, das ich den inhalt von edx direkt nach buf[h] kopieren kann, ohne zuhilfenahme von 'b'.

    Meep Meep



  • kann dann aber auch nicht klappen, weil b ein int ist.

    entscheide dich mal 😉

    der in edx steht in ein char kopieren.

    so hab ich das verstanden.

    mir gehts darum, das ich den inhalt von edx direkt nach buf[h]

    was für einen Datentyp hat denn buf ? Ich nehme an dass es int ist oder?
    Falls es int ist und die elemente damit größer als 1 Byte muss die Adresse des Arrayelements vorher kalkuliert werden (Index*Sizeof(Array_Element)+Anfangsadresse des Arrays). Das wäre in soweit ungünstig als dass man multiplizieren müsste und damit EDX überschreiben würde.Man könnte es aber umgehen in dem man den Index direkt so gestaltet dass dieser nicht mehr multipliziert werden müsste.

    lea ebx,[buf][h] ;h oder sonstiges zeug
    mov dword ptr[ebx],edx
    

    h ist in diesem Fall der "index" und setzt voraus dass es jeweils um die Größe des Array_elementes incrementiert wird. Ob das sich "lohnt"?

    int h=0;
    a /= 10;
    __asm {lea ebx,[buf][h]}
    __asm {mov dword ptr[ebx],edx}
    __asm {add h,4}
    

    4 ist in diesem Fall die angenommene Größe eines Elementes im Buf. Hier kommt normalerweise ein sizeof, ich bin mir aber nicht sicher ob dein integrierter Assembler die richtig verarbeitet.



  • hoi CDW

    buf ist ein char-array.
    so sieht das genau aus. haett ich eumel eigendlich gleich dazuschreiben koennen:

    unsigned int a;
    unsigned int l;
    unsigned int b;
    char buf[12];
    
    a /= 10;
    __asm { mov b, edx; }
    buf[l++] = b;
    

    Meep Meep



  • und ich rätseler rum 😉
    hm, ich hab nur VS C++ 6 als testumgebung, die ist irgendwie komisch, akzeptiert jedoch diesen Code:

    int main()
    {   
    unsigned int a;
    unsigned int l=0;
    char buf[12];
    
    a=12;
    a /= 10;
    __asm {
    
            lea ebx,buf
            add ebx,l
            mov [ebx],edx
            inc l
    }
    
    printf(" %d",buf[0]);
    return 0;
    }
    

    man beachte aber dass wenn man der Funktion die Parameter wie buf usw erst übergibt, dass diese über den Stack wandern und man deshalb sowas schreiben muss:

    #include <iostream>
    #include <string>
    
    void umwandeln(unsigned int a,unsigned int l,char *buf)
    {
    a /= 10;
    __asm {
    
            mov ebx,buf
            add ebx,l   
            mov [ebx],edx
          }
    }
    
    int main()
    {   
    
    unsigned int l=0;
    char buf[12];
    
    umwandeln(20,l++,buf);
    umwandeln(33,l++,buf);
    printf(" %d %d",buf[0], buf[1]);
    
    return 0;
    }
    

    Edit: formatierung korrigiert


Anmelden zum Antworten