数値を ieee から TNS (ビッグ エンディアン) に、またはその逆に変換するプログラムを作成しようとしています。私はARMとアセンブリ全般に非常に慣れていません。エラーは発生していません。意図したとおりに機能していないだけです。誰かがそれを見てくれれば幸いです。すべての行にコメントが付けられています。ここで実際に問題になっているサブルーチンは、「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