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