0

ieee 番号を TNS 形式の番号に変換する ARM プログラムを作成しようとしています。TNS は一部のスーパー コンピューターで使用される形式で、ieee に似ていますが異なります。いくつかのマスクを使用して、ieee 番号の 3 つの異なる「部分」を別々のレジスタに配置して、それに応じて移動できるようにしようとしています。これが私のアンパックサブルーチンです:

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

そして、理解できるように、マスクと数値の宣言を次に示します。

IEEE        DCD 0x40300000  ;2.75 decimal or 01000000001100000000000000000000 binary
SMASK       DCD 0x80000000  ;Sign bit mask
EMASK       DCD 0x7F800000  ;Exponent mask
GMASK       DCD 0x007FFFFF  ;Significand mask

デバッガーをステップ実行すると、得られる結果は、紙の上で作業した後に期待するものではありません。編集: つまり、サブルーチンの実行後、レジスタ 4、5、および 6 はすべて 0 のままです。マスクが機能しない理由がわかりません。数字がレジスタにどのように格納されているか、またはマスクが間違って使用されているかを完全には理解していないと思います。どんな助けでも感謝します。さらに情報が必要な場合は、お尋ねください。

編集: エントリ ポイント: 非常に単純です。これらのサブルーチンを機能させようとするだけです。

ENTRY

    LDR r1, IEEE    ;load IEEE num into r1
    BL  UnpackIEEE  ;call unpack sub
    SWI     SWI_Exit    ;finish
4

1 に答える 1

2

ここ:

LDR r1, IEEE    ;load IEEE num into r1

アンパック ルーチンの外観から、数値をr0ではなくにロードしたいようですr1r1アンパックルーチンの最初の行で上書きされます:

UnpackIEEE
    LDR r1, SMASK   ;load the sign bit mask into r1 
于 2012-12-17T23:14:31.583 に答える