write moz img images how for example alternative assembly arm ieee

assembly - moz - how to write alt text



Programa de conversión de número ARM (1)

Estoy intentando escribir un programa que convertirá un número de ieee a TNS (big endian) y viceversa. Soy muy nuevo en ARM y montaje en general. No me aparece un error, simplemente no funciona como estaba previsto y agradecería que alguien pudiera verlo. Cada línea es comentada, la sub rutina actualmente en cuestión aquí es el procedimiento "desempaquetar ieee", no está funcionando como se esperaba y no puedo ver por qué. EDITAR: los números IEEE y TNS tienen 3 partes, estoy intentando "agarrar" o separar las 3 partes usando las máscaras. El procedimiento de desempaquetado usa las máscaras para colocar cada parte en un registro separado para poder manipular cada parte para convertirla. Actualmente estoy intentando confirmar que el procedimiento de desempaquetado funciona llamándolo, y luego imprimiendo los registros. Los números no se imprimen o imprimen resultados incorrectos. editar final Aún no he escrito las rutinas de conversión, pero tengo un algoritmo de psicocódigo que puedo publicar si lo desea. Solo avíseme si hay algo más que le gustaría saber. El 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


Creo que sé entender lo que estás tratando de lograr.

Escribí un programa que usa el número decimal 15.75.
Este número se almacena en formato IEEE754.
Primero se convierte al formato TNS, el número convertido se imprime en la consola. El número se convierte de nuevo al formato IEEE745. El número convertido se imprime en la consola y luego sale el programa.

Este programa está escrito para ARM7.

Eche un vistazo al código si parece que eso es lo que está tratando de lograr:

ENTRY LDR r0, IEEE ; Load IEEE formatted # into r0 BL ieeetotns ; Branch to IEEE to TNS conversion subroutine BL Print ; Branch to print number to console BL tnstoieee ; Branch to TNS to IEEE conversion subroutine BL Print ; Branch to print number to console SWI SWI_Exit ; Exit Program ; Load IEEE Masks into registers ieeetotns LDR r1, SIGNMASK ; Load sign mask into r1 LDR r2, IEEEEXPMASK ; Load IEEE exponent mask into r2 LDR r3, IEEESIGMASK ; Load IEEE significand mask into r3 ; Convert from IEEE to TNS AND r4, r0, r1 ; unpack sign bit, store in R4 AND r5, r2, r0 ; initial unpack of exponent, store in r5 MOV r5, r5, LSR #23 ; shift exponent right 23 bits ADD r5, r5, #129 ; add 129(10) to exponent to correct excess encoding for TNS AND r6, r3, r0 ; initial unpack of significand, store in r6 ADD r6, r7, r6, LSL #8 ; shift significand left 8 bits, kill off LSB ORR r0, r4, r5 ; pack sign and exponent ORR r0, r0, r6 ; pack significand with sign and exponent, ; r0 now holds IEEE to TNS converted word MOV PC, LR ; Return to main subroutine ; Load TNS Masks tnstoieee LDR r1, SIGNMASK ; Load sign mask into r1 LDR r2, TNSSIGMASK ; Load TNS Significand mask into r2 LDR r3, TNSEXPMASK ; Load TNS Exponent mask into r3 ; Convert back to IEEE AND r4, r0, r1 ; unpack sign bit AND r5, r2, r0 ; initial unpack of significand, store in r5 MOV r5, r5, LSR #8 ; Shift significand right 8 bits AND r6, r3, r0 ; Initial unpack of exponent, store in r6 SUB r6, r6, #129 ; Subtract 129 to correct excess encoding ADD r6, r7, r6, LSL #23 ; Shift exponent left 23 bits ; Pack the converted number into r0 ORR r0, r4, r5 ; Pack sign and significand ORR r0, r0, r6 ; Pack exponent with sign and significand, ; r0 now holds TNS to IEEE converted word MOV PC, LR ; Return to main subroutine Print MOV r2, #8 ; Count of nibbles = 8 MOV r1, r0 ; Move number to r1 MOV r3, r0 ; Store converted number in r3 for later LOOP MOV r0, r1, LSR #28 ; Get top nibble CMP r0, #9 ; Hex number 0-9 or A-F? ADDGT r0, r0, #"A"-10 ; ASCII A-F ADDLE r0, r0, #"0" ; ASCII 0-9 SWI SWI_WriteC ; Print character to console MOV r1, r1, LSL #4 ; Shift left one nibble SUBS r2, r2, #1 ; Decrement nibble count BNE LOOP ; If more nibbles loop again MOV r0, #10 ; Load 10 into r0, ASCII code for carriage return SWI SWI_WriteC ; Print carriage return to console MOV r0, r3 ; Move converted number back to r0 MOV PC, LR ; Return to main subroutine IEEE DCW 0x0000, 0x417C ; IEEE Representation of 15.75(10), 417C0000(16), ; 01000001011111000000000000000000(2) TNS DCW 0x0103, 0x7C00 ; TNS Representation of 15.75(10), 7C000103(16), ; 01111100000000000000000100000011(2) ; This is not used in program, simply here for comparison of conversions SIGNMASK DCW 0x0000, 0x8000 ; Mask for sign bit IEEEEXPMASK DCW 0x0000, 0x7F80 ; Mask for IEEE Exponent IEEESIGMASK DCW 0xFFFF, 0x007F ; Mask for IEEE Significand TNSSIGMASK DCW 0xFE00, 0x7FFF ; Mask for TNS Significand TNSEXPMASK DCW 0x01FF, 0x0000 ; Mask for TNS Exponent END