StrToInt?
-
Hallo Leute!
Ich würde gerne eine Zeichenkette (wie z.B. myStr db "135",0h) in eine ganz normale Zahl (wie z.B. myInt dd 135d) umwandeln, um damit zu rechnen. Ich habe schon die WINAPI-Funktion AsciiToInt gesehen, damint kann man jedoch nur Zahlen von 0 - 100 umwandeln. In der FAQ und in der Suchmaschiene habe ich leider nichts gefunden. Kennt jemand zufällig eine Funktion oder ein Makro, mit dem man beligig große Zeichenketten in Zahlen umwandeln kann?
MfG
mastercppPS: Ist für ein Win32-GUI-Prog
-
das sollte nicht so schwer sein. ich versuche mal kurz das hier zu coden (kann nicht garantieren, dass es klappt, denn ich habe gerade keinen compiler hier):
ascii2int: push ebp mov ebp,esp mov edi,[ebp+08h] xor eax,eax xor ecx,ecx get_end: inc ecx scasb jnz get_end dec edi dec ecx std xor esi,esi mov ebx,10 conv_loop: lodsb sub eax,'0' mul ebx add esi,eax imul ebx,ebx,10 loop conv_loop mov eax,esi cld pop ebp ret 04h
keine Fehlerabfrage, nur unsigned ints. Der Code sollte den String von hinten nach vorne abarbeiten, jeweils ein Zeichen einlesen, davon ASCII 0 abziehen und mit der entsprechenden Zehnerstelle multiplizieren.
Aufruf:
push offset string
call ascii2intIch hoffe der obige Code funktioniert so. Hab gerade nicht viel Zeit.
[ Dieser Beitrag wurde am 02.11.2002 um 17:57 Uhr von malfunction editiert. ]
-
Hab den Code zwar nicht ausprobiert, aber nochmal ein kuerzeres Beispiel, das auch mit Sicherheit funktioniert
data MyString db "65538",00h code xor eax,eax mov ebx,0000000Ah mov esi,offset MyString @@ConvertLoop: movzx ecx,[byte ptr esi] ;Zeichen laden. test ecx,ecx jz short @@ExitConvertLoop ;0=>Exit inc esi sub cl,30h ;0-9... mul ebx ;Ergebnis * 10 add eax,ecx ;+naechste Ziffer jmp short @@ConvertLoop @@ExitConvertLoop: ;usw... Ergebnis in eax.
[ Dieser Beitrag wurde am 02.11.2002 um 18:30 Uhr von Nobuo T editiert. ]
-
Ok, ich gebe ja zu, dass Nobuo_T's Lösung 1000 mal besser ist, aber ich hab meinen Code ja auch nur eben schnell in 5 Minuten in die Tasten gehauen und nicht sehr lange drüber nach gedacht.
@Nobuo_t: Ich würde allerdings das "byte ptr ds:si" in "byte ptr esi" ändern. Laut mastercpp soll es doch schließlich für ein Win32 Prog sein.
-
ups. Hab ich uebersehen, sorry.
-
Hallo!
Danke für die Antworten.
Als ich den Code von Nobuo T assemblieren wollte gab der Assembler in der Zeile "movzx ecx,[byte ptr esi] ;Zeichen laden." die Meldung "error: parser: expecting ]" aus. Nach kurzem rumprobieren erkannte ich dann, dass ich die Zeile durch "movzx ecx,byte [esi] ;Zeichen laden." ersetzten musste, was ich dann auch tat.
Jetzt funktioniert es.