Programa de conversão de número ARM

Eu estou tentando escrever um programa que irá converter um número de ieee para TNS (big endian) e vice-versa. Sou muito novo no ARM e na montagem em geral. Eu não estou recebendo um erro, ele simplesmente não está funcionando como pretendido e eu apreciaria se alguém pudesse olhar para ele. Cada linha é comentada, a sub-rotina realmente em questão aqui é o procedimento "desempacotar ieee", não está funcionando como planejado e não consigo ver o porquê. EDIT: números IEEE e TNS têm 3 partes, eu estou tentando "pegar" ou separar as 3 partes usando as máscaras. O procedimento de desempacotamento está usando as máscaras para colocar cada parte em um registrador separado para que eu possa manipular cada parte para convertê-la. Atualmente estou tentando confirmar que o procedimento de desempacotamento funciona, chamando-o e, em seguida, imprimindo os registros. Os números não estão imprimindo ou imprimindo resultados incorretos.end edit Eu não escrevi as rotinas de conversão ainda, mas eu tenho um algoritmo de psudocode que eu posso postar se você quiser. Apenas deixe-me saber se há mais alguma coisa que você gostaria de saber. O código:

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