2012-12-09 5 views
0

숫자를 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 
+0

을 당신은 자세한 내용에 문제를 설명해야한다고 생각, "의도 한대로 작동하지 않는"비트가 너무 넓은. 자세한 내용은 –

+0

오케이 편집 게시물을 참조하십시오. –

답변

0

은 내가 당신이 달성하려고하는 것을 이해 알고 있다고 생각.

10 진수 15.75를 사용하는 프로그램을 작성했습니다.
이 숫자는 IEEE754 형식으로 저장됩니다.
먼저 변환 된 숫자가 TNS 형식으로 변환되어 콘솔에 인쇄됩니다. 그 다음 번호는 다시 IEEE745 형식으로 변환됩니다. 변환 된 숫자가 콘솔에 인쇄 된 다음 프로그램이 종료됩니다.

이 프로그램은 ARM7 용으로 작성되었습니다.

가 그런 소리하면 코드를 살펴 당신이 달성하려고하는 것입니다 :

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 
관련 문제