숫자를 ieee에서 TNS (빅 엔디안)로 변환하는 프로그램을 작성하려고합니다. 그 반대의 경우도 마찬가지입니다. 저는 ARM과 어셈블리에 대해 매우 익숙합니다. 나는 의도 한대로 작동하지 않고 오류가 발생하지 않으며 누구나 볼 수 있으면 감사하게 생각합니다. 모든 라인은 주석 처리가되어 있습니다. 실제로 여기에있는 서브 루틴은 "unpack ieee"절차입니다. 의도 한대로 작동하지 않고 왜 볼 수 없습니다. 편집 : IEEE 및 TNS 번호는 3 부분으로, 나는 "잡아"또는 마스크를 사용하여 3 부분을 분리하려고 시도합니다. 언팩 절차는 마스크를 사용하여 각 파트를 별도의 레지스터에 배치하므로 각 파트를 변환하여 조작 할 수 있습니다. 현재 나는 언팩 절차가 그것을 호출하고 레지스터를 인쇄하여 작동하는지 확인하려고합니다. 숫자가 인쇄되지 않거나 잘못된 결과가 인쇄됩니다. end edit 아직 변환 루틴을 작성하지는 않았지만 원하는 경우 게시 할 수있는 psudocode 알고리즘이 있습니다. 알고 싶은 다른 것이 있으면 알려주세요. 코드 :ARM 번호 변환 프로그램
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
을 당신은 자세한 내용에 문제를 설명해야한다고 생각, "의도 한대로 작동하지 않는"비트가 너무 넓은. 자세한 내용은 –
오케이 편집 게시물을 참조하십시오. –