2016-12-16 4 views
0

Also mein Code konvertiert derzeit eine Zeichenfolge in eine ganze Zahl. Mein Code funktioniert derzeit und ist funktional, aber ich brauche ein "-" am Anfang der Eingabe, um zu beurteilen, ob es ein Negativ ist oder nicht. Ich habe keine Ahnung, wie ich das machen soll und finde keine Quellen. Ich übergebe gerade (test3: .asciz "-48") ins Register r0. und wenn ich im Debugger laufe, erhalte ich 45. hier ist mein Code als Referenz.ARM Assembly akzeptiert '-'

.global stoi 
    .text 
stoi: 
    push {r4,r5,r6,r8,r9,lr} 
    @r0 = buffer 
    mov r1,#0   @r1 = n = 0 
    mov r9,#0   @buffer counter 
    mov r4,#48  @0 checker 
    mov r5,#57  @9 checker 
    b 5f 

5: 
    ldrb r3,[r0,r9]  @r3 = c 

    b 1f 

1: 
    cmp r3,r4   @cmp c to 0(48 in ASCII) 
    bge 2f 
    b 4f 
2: 
    cmp r3,r5  @cmp c to 9(57 in ASCII) 
    ble 3f 
    b 4f 
3: 
    sub r6,r3,#'0'  @r6 = (c - '0') 
    @strb r6,[r0,r9] 
    add r1,r1,r1,lsl#2 @r1 = n * 10 
    add r1,r1,r1,lsl#0 

    add r1,r1,r6  @n = n * 10 + (c - '0') 

    add r9,r9,#1  @add to buffer 
    b 5b 

4: 
    mov r0,r1 
    pop {r4,r5,r6,r8,r9,pc} 
+0

Hinweis: Beginnen Sie mit der Implementierung des Algorithmus in einer Hochsprache, in der Sie arbeiten bequem, dann stufen Sie die Referenzimplementierung allmählich auf die Ebene entsprechen und Fähigkeiten des Assembler-Codes. – doynax

+0

danke für den Ratschlag, aber ich bin neu in der Programmierwelt und die einzige Sprache, die ich bisher gelernt habe, ist Python. und das ist eine einfache "int (string)". –

+0

Mein Punkt ist, dass Assemblersprachendetails eine Ablenkung vom Verstehen des Algorithmus sind. Beginnen Sie mit der Skizzierung des Prinzips, wie Sie es in Python manuell ausführen würden, ohne die unterstützenden Funktionen zu verwenden, durch ein Flussdiagramm oder eine andere Methode. Setzen Sie sich dann hin und implementieren Sie den Assemblercode. – doynax

Antwort

4

den gleichen Code verwenden Sie jetzt verwenden, und diese Änderungen hinzu:

1) überspringen die ‚-‘ wenn es das erste Zeichen. Momentan stoppst du, wenn ein nicht-stelliges Zeichen gelesen wird, du erhältst 45 (in R3), es ist das ASCII von '-'. Afais R1 sollte 0 sein, noch tho

2) Am Ende, fügen Sie einen Scheck, wenn das erste Zeichen ist ein '-', und wenn es ist, subtrahieren r1 von 0 (da 0 - x -x)

(3) entfernen Sie die b 1f, es ist nicht erforderlich;))

+1

@Blake: Reinigen Sie die anderen Verzweigungen allgemeiner, indem Sie die Verzweigungsbedingungen in eine einzelne Verzweigungs- oder Durchfallanweisung umwandeln, anstatt über eine unbedingte Verzweigung zu springen . Und verwenden Sie sinnvolle Namen für Ihre Branchenkennzeichen, nicht nur Zahlen. –

Verwandte Themen