我正在尝试编写一个程序,将数字从 ieee 转换为 TNS(大端),反之亦然。一般来说,我对 ARM 和汇编很陌生。我没有收到错误,它只是没有按预期工作,如果有人可以查看它,我将不胜感激。每一行都有注释,这里实际讨论的子程序是“unpack ieee”程序,它没有按预期工作,我不明白为什么。编辑:IEEE 和 TNS 号码有 3 个部分,我正在尝试使用掩码“抓取”或分离这 3 个部分。解包过程使用掩码将每个部分放入单独的寄存器中,以便我可以操作每个部分以进行转换。目前我正在尝试通过调用它来确认解包过程是否有效,然后打印寄存器。结束编辑我还没有编写转换例程,但是如果您愿意,我可以发布一个伪代码算法。如果您还有其他想知道的,请告诉我。编码:
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