1

アセンブリ(pep8)のクラスの1つにプログラムを書いています。プログラムは、-32,768〜32,767の整数を取り込んで、それに相当する2進数を出力することになっています。以下のコードは、2進数を逆方向に出力することを除いてタスクを実行します。

2進数を正しい順序で印刷するためのエレガントな方法はありますか(つまり、すべての2進数をローカル変数に格納してから、逆の順序で印刷したくない)。

        BR main
int:             .EQUATE 0                ;local variable int
out:             .EQUATE 2                ;local variable out
index:           .EQUATE 4                ;local variable index
stack:           .EQUATE 6                ;local variable for dynamic memory allocation



main:            SUBSP       stack,i      ;allocate memmory
                 LDA         0,i          
                 STA         index,s      ;initialize index
                 DECI        int,s        ;get user input and store it in num 
while:           LDA         index,s      ;while (num <= 16)
                 CPA         16,i         ;
                 BRGE        endWhile     ;
                 ADDA        1,i          ;index++
                 STA         index,s      ;
                 LDA         int,s        ;
                 ANDA        0x0001,i     ;modulus 2 "%2"
                 STA         out,s        ;
                 DECO        out,s        ;output results 
                 LDA         int,s        ;
                 ASRA                     ;devide num by 2
                 STA         int,s        ;

                 BR          while        ;
endWhile:        ADDSP       stack,i      ;deallocate memmory
                 STOP
                 .END
4

1 に答える 1

2

私はこの特定の種類のアセンブリに精通していませんが、値を左にシフトしてキャリーフラグをチェックすると、すべてのアーキテクチャでバイナリの出力が比較的簡単になりますC

レジスタを左にシフトすると、その最上位ビットはで終わりますC。次に、別のレジスタをゼロに設定し、ソース値を左にシフトした直後に左に回転します。元の値の最上位ビットは、レジスタの最下位ビットにあります。

Register   C   Value
--------   -   --------
00000000   x   11001010 // Initially
00000000   1   10010100 // After left-shifting the value
00000001   0   10010100 // After left-rotating the register

レジスタを出力し、ゼロに戻し、続行します。これにより、ビットが正しい順序で出力されます。

このトリックは、アセンブリプログラマーのみが利用できることに注意してください。キャリーフラグが届かないため、C /C++プログラマーはアクセスできませんC

于 2012-10-26T18:24:44.213 に答える