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