私は理解できないという問題があります:
アセンブリ言語で、整数の配列へのポインターとこの配列のサイズを受け取り、配列をスタックにコピーせずに要素を逆にして配列を変更する関数を作成します。esi
配列 ( 、edi
; lodsb
、stosb
、cld
)を操作するには、専用の命令とレジスタを使用しますstd
。
例: 1 2 3 4 5 -> 5 4 3 2 1
誰にも提案はありますか?
lodsb
および各要素に対してstosb
必要な配列を逆にする(ポインターの 1 つをインクリメントする必要がcld
あり、もう 1 つをデクリメントする必要があるため)、または別の方法として、他のポインターの誤ったインクリメント (またはデクリメント) をstd
忘れcld
てキャンセルするstd
各要素の後に 2 を減算 (または 2 を加算) します。
とにかく、この場合lodsb
andを使用すると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: