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