0

私は理解できないという問題があります:

アセンブリ言語で、整数の配列へのポインターとこの配列のサイズを受け取り、配列をスタックにコピーせずに要素を逆にして配列を変更する関数を作成します。esi配列 ( 、edi; lodsbstosbcld)を操作するには、専用の命令とレジスタを使用しますstd

例: 1 2 3 4 5 -> 5 4 3 2 1

誰にも提案はありますか?

4

1 に答える 1

2

lodsbおよび各要素に対してstosb必要な配列を逆にする(ポインターの 1 つをインクリメントする必要がcldあり、もう 1 つをデクリメントする必要があるため)、または別の方法として、他のポインターの誤ったインクリメント (またはデクリメント) をstd忘れcldてキャンセルするstd各要素の後に 2 を減算 (または 2 を加算) します。

とにかく、この場合lodsbandを使用するとstosb、私の意見では物事が不必要に複雑になります。私は次のようなものを使用します:

    mov esi,start_address
    mov edi,end_address

    mov ecx,edi
    sub ecx,esi

x1: test ecx,ecx
    jz @ready

    mov al,[esi]
    xchg al,[edi]
    mov [esi],al
    inc esi
    dec edi
    dec ecx
    jmp x1

@ready:
于 2012-11-25T02:39:53.383 に答える