0

私は、LC-3 アセンブリ言語に基づいて .asm プログラムを作成しています。このプログラムは、文字列のリストをループし、それぞれを逆にして、リスト内の場所に戻します。

例えば:

     STRINGS .STRINGZ "aabbb"
                      "bbcva"
                      "abcde"

プログラムはそのリストを " bbbaa"、" avcbb"、および " edcba" に反転します。つまり、文字列を逆にしますが、リストの順序は維持します。

私は現在、ネストされたループのアイデアに取り組んでいます.外側のループが弦から弦へと移動し、内側のループがそれらを反転し、それは私のお尻を蹴っています! 同じことをするために Java でコードを書き、5 分かかりましたが、何らかの理由で、アセンブリが私の脳にうんざりしています。これを行う方法についての指針はありますか?

これまでのところ、疑似とアセンブリを組み合わせたものを次に示します。

    .ORIG x3000
    LEA R0, STRINGS            ; Load the address of the first char of the list of strings
    Loop until NOP is found, signaling end of the string.
    LEA R1, the address above  ; stores the address of the last char
    LDR R2, #0 Offset +1       ; load the first char to be flipped
    LDR R3, #0 Offset +2       ; load the last char to be flipped
    STR R3, #0 Offset +1       ; store the last char in the mem addr of the first
    STR R2, #0 Offset +2       ; store the first char in the addr of the last
    ADD R1, R1 + 1             ; increment the addr of the first char to move to the second
    ADD R2, R2 - 1             ; decrement the addr of the last char the move the second-to-last
    loop back to beginning somehow

そして、文字列間の外側のループを行う方法が少しもわかりません。

TL;DR - メモリ内の文字列を逆にするアセンブリ プログラム、助けてください。

4

1 に答える 1

0

たぶん、文字列の半分に行き、文字を交換する内側のループを書くべきですか? 最初から i か所の 1 つと、最後から i か所の 1 つですか? 末尾の NUL はそのまま残されます。文字数が奇数の場合は真ん中の文字がそのまま残ります。文字列の長さを 2 で割ると (右に 1 ビットシフト)、ループする文字数が得られます。Reminder は 0 または 1 のいずれかです (この場合、余分な文字は奇数文字列の中間文字になります)。したがって、str[i] と str[last-i] を (一時ストアを介して) 交換します。ここで、'last' は文字列の長さ - 1 です。多くの場合、アセンブリでは逆方向にループする方が簡単です: len/2 から開始して、 index はゼロです (ループ開始への条件付きジャンプの終了条件も同様です)。

于 2014-03-28T23:03:08.657 に答える