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
    mastercpp

    PS: 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 ascii2int

    Ich 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.


Anmelden zum Antworten