ARM-Nummernkonvertierungsprogramm

Ich versuche ein Programm zu schreiben, das eine Zahl von ieee nach TNS (Big Endian) konvertiert und umgekehrt. Ich bin sehr neu in ARM und Montage im Allgemeinen. Ich bekomme keine Fehlermeldung, es funktioniert einfach nicht wie beabsichtigt und ich würde es begrüßen, wenn jemand es sich ansehen könnte. Jede Zeile ist kommentiert, die Subroutine, um die es hier geht, ist die Prozedur "ieee entpacken", sie funktioniert nicht wie beabsichtigt und ich kann nicht verstehen warum. EDIT: IEEE- und TNS-Nummern bestehen aus 3 Teilen. Ich versuche, die 3 Teile mithilfe der Masken zu "greifen" oder zu trennen. Beim Entpacken werden die Masken verwendet, um jedes Teil in einem separaten Register abzulegen, sodass ich jedes Teil manipulieren kann, um es zu konvertieren. Momentan versuche ich zu bestätigen, dass das Entpacken funktioniert, indem ich es aufrufe und dann die Register drucke. Die Zahlen werden entweder nicht gedruckt oder es werden falsche Ergebnisse gedruckt.Bearbeiten beenden Ich habe die Konvertierungsroutinen noch nicht geschrieben, aber ich habe einen Psudocode-Algorithmus, den ich posten kann, wenn Sie möchten. Lassen Sie mich einfach wissen, ob Sie noch etwas wissen möchten. Der Code:

AREA Conversion, CODE
SWI_WriteC  EQU &0          ;output character in r0 
SWI_WriteL  EQU &2          ;output String in r0
SWI_Exit    EQU &11         ;finish program
    ENTRY

    ADR r0, STRING  ;load string
    SWI SWI_WriteL  ;print string
    LDR r1, IEEE    ;load IEEE num into r0
    BL  Print       ;print number
    BL  UnpackIEEE  ;call UnpackIEEE subroutine
    ADR r1, r4      ;
    BL  Print
    SWI     SWI_Exit    ;finish

UnpackIEEE
    LDR r1, SMASK   ;load the sign bit mask into r1 
    LDR r2, EMASK   ;load the exponent mask into r2
    LDR r3, GMASK   ;load the significand mask into r3
    AND r4, r0, r1  ;apply sign mask to IEEE and save into r4
    AND r5, r0, r2  ;apply exponent mask to IEEE and save into r5
    AND r6, r0, r3  ;apply significand mask to IEEE and save into r6
    MOV     pc, r14     ;return

ConvToTNS


Print   MOV r2,#8       ;count of nibbles = 8
LOOP    MOV r0,r1,LSR #28   ;get top nibble
    CMP     r0, #9      ;hexanumber 0-9 or A-F
    ADDGT   r0,r0, #"A"-10  ;ASCII alphabetic
    ADDLE   r0,r0, #"0" ;ASCII numeric
    SWI     SWI_WriteC  ;print character
    MOV r1,r1,LSL #4    ;shift left one nibble
    SUBS    r2,r2, #1   ;decrement nibble count
    BNE LOOP        ;if more nibbles,loop back
    MOV     pc, r14     ;return


IEEE    DCD 0x40280000  ;2.75 or 40,280,000
TNS     DCD 0x28000101  ;2.75 or 28,000,101
SMASK   DCD 0x80000000  ;Sign bit mask
EMASK   DCD 0x7F800000  ;Exponent mask
GMASK   DCD     0x007FFFFF  ;Significand mask
STRING  DCB "HI THERE",0
    END

Antworten auf die Frage(1)

Ihre Antwort auf die Frage