2017-03-19 2 views
3

Ich versuche, eine vom Benutzer eingegebene Zeichenfolge von Zahlen in eine ganze Zahl zu konvertieren.Konvertieren einer Zeichenfolge von Zahlen in eine Ganzzahl in Assembly X 86

Zum Beispiel gibt der Benutzer "1234" als Zeichenfolge ein, die 1234 in einer DWORD-Variablen gespeichert werden soll.
Ich verwende lodsb und stosb, um die einzelnen Bytes zu erhalten. Mein Problem ist, dass ich den Algorithmus nicht richtig dafür finden kann. Mein Code ist unten:

mov ecx, (SIZEOF num)-1 
mov esi, OFFSET num 
mov edi, OFFSET ints 
cld 

counter: 
    lodsb 
    sub al,48 
    stosb 
    loop counter 

Ich weiß, dass die ECX Zähler ein bisschen off auch sein wird, weil es die gesamte Zeichenfolge nicht nur die 4 Bytes gelesen wurden, so ist es eigentlich 9, da die Zeichenfolge 10 Byte.

Ich habe versucht, Potenzen von 10 zu verwenden, um die einzelnen Bytes zu multiplizieren, aber ich bin ziemlich neu in Assembly und kann nicht die richtige Syntax dafür erhalten. Wenn jemand mit dem Algorithmus helfen kann, wäre das großartig. Vielen Dank!

+0

Verwenden Sie die C-Bibliothek – Jerfov2

+0

hier Werfen Sie einen Blick http://stackoverflow.com/questions/19309749/nasm-assembly-convert-input-to-integer/19312503#19312503 – BioGenX

Antwort

1

Eine einfache Implementierung könnte

mov ecx, digitCount 
    mov esi, numStrAddress 

    cld      ; We want to move upward in mem 
    xor edx, edx   ; edx = 0 (We want to have our result here) 
    xor eax, eax   ; eax = 0 (We need that later) 

counter: 
    imul edx, 10   ; Multiply prev digits by 10 
    lodsb     ; Load next char to al 
    sub al,48    ; Convert to number 
    add edx, eax   ; Add new number 
    ; Here we used that the upper bytes of eax are zeroed 
    loop counter   ; Move to next digit 

    ; edx now contains the result 
    mov [resultIntAddress], edx 

natürlich gibt es Möglichkeiten, es zu verbessern, wie die Verwendung von imul zu vermeiden.

EDIT: Der Fehler, der ECX Wert

+0

[Die 'loop'-Anweisung ist bei den meisten CPUs langsam] (https://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-it- effizient); Verwenden Sie einfach 'dec' /' jnz', oder verzweigen Sie zu den Flags, die von 'sub al, 48' gesetzt wurden (um nach dem Laden eines Nicht-Ziffern-Zeichens zu stoppen). Sie könnten 'lea edx, [rdx + rax]' verwenden, um hinzuzufügen, ohne die Flags zu beeinflussen. Und yeah, da Sie LEA verwenden können, um zu verschieben und hinzuzufügen, können Sie 'edx = eax + edx * 10' mit 2 LEA-Anweisungen tun. gcc macht guten Code für solche Schleifen. –

Verwandte Themen