2016-11-02 5 views
1

ちょっと、配列(1,2,3,4,5,6,7,8,9,10)をループして要素を交換するプログラムを作成する必要があります'i'が4未満のとき 'i'要素が 'i'であるプログラムが終了すると、新しい配列の値は6,7,8,9,10,1,2,3,4,5アセンブリx86では、配列の値をループして置換する

と、今私はそれは、配列

.386 
.model flat,stdcall 
.stack 4096 
ExitProcess proto,dwExitCode:dword 
WriteDec PROTO 
Crlf PROTO 
DumpRegs PROTO 
.data 
arrayB WORD 1,2,3,4,5,6,7,8,9,10 
.code 
main proc 
mov eax,0 

mov edi,OFFSET arrayB ; address of arrayB 
mov ecx,LENGTHOF arrayB ; loop counter 

mov ax,0 ; zero the accumulator 

L1: 
mov ax,[edi] ; mov current edi value from array into ax 
xchg arrayB, ax ;change the current ax register with the value in arrayB 
add edi,TYPE arrayB ; point to next integer 

    loop L1 

    call DumpRegs 
    call WriteDec 
    call crlf 
    invoke ExitProcess,0 
main endp 
end main 

をループしている。しかしImはループが4の下にあるときに言っa)は、実際に問題が発生したと、b)正確な値を置き換えます。すべてのヘルプはいただければ幸いです

編集:私は、私は

+0

あなたの質問に新しい答えがあります。 –

答えて

1

あなたが一つの解決策は、エレメント+ 5を指し、bxに格納するesiを使用し、次いでedibxを移動しaxを移動することで、配列の要素を指し、axに格納するediを使用しています(方法によって、ループは半アレイ長回繰り返すべきである)esiへ:

.386 
.model flat,stdcall 
.stack 4096 
ExitProcess proto,dwExitCode:dword 
WriteDec PROTO 
Crlf PROTO 
DumpRegs PROTO 
.data 
arrayB WORD 1,2,3,4,5,6,7,8,9,10 
.code 
main proc 
;mov eax,0    ;◄■■ UNNECESSARY. 

mov edi,OFFSET arrayB ; address of arrayB 
mov ecx,5    ;◄■■ 10 ÷ 2 ("when ‘i' is under 4"). 

;mov ax,0    ;◄■■ UNNECESSARY. 

L1: 
mov ax,[edi]   ; mov current edi value from array into ax 
mov esi,edi 
add esi,TYPE arrayB * 5 ;◄■■ ELEMENT "I+5". 
mov bx,[esi]   ;◄■■ BX = "I+5". 
mov [edi],bx   ;◄■■ EXCHANGE ONE REGISTER. 
mov [esi],ax   ;◄■■ EXCHANGE THE OTHER REGISTER. 
add edi,TYPE arrayB  ; point to next integer 
    loop L1 
;---------------------------------------------- 
    mov edi, OFFSET arrayB 
    mov ecx, LENGTHOF arrayB 
DISPLAY_ARRAY: 
    xor eax, eax 
    mov ax, [edi] 
    call WriteDec 
    add edi,TYPE arrayB  ; point to next integer 
    loop DISPLAY_ARRAY 
;---------------------------------------------- 
    call DumpRegs 
    call WriteDec 
    call crlf 
    invoke ExitProcess,0 
main endp 
end main 

配列要素を表示するためにループを追加するための答えを編集。

+0

おかげさまで、ありがとうございました。しかし、コードを使用したときには、 "1> Array.asm(1):エラーA2044:ファイル内に無効な文字があります"というメッセージが表示されています –

+0

私はやったけど、 ? –

+0

ええ、コードを除いてすべてが消えていて、それでも文句はありますか? 編集:OK今、すべてを削除しました。これは白い画面です。無効な文字があるという問題が残っています –

2

あなたの仕事の説明が矛盾しているECXレジスタを比較する「CMP」を使用することができます知っています。配列は最後に6,7,8,9,10,1,2,3,4,5でなければならず、それは4未満ではなく、5未満のインデックス(要素0〜4)を持つすべての要素を交換することを要求します

LOOPコマンド(これは良い考えではありませんが、それはポイントの横にあります)は、暗黙のカウンタとしてECXを使用しています。 ECXが0でなければ、それはデクリメントしてラベルにジャンプし、0であればラベルにジャンプします。だからあなたは正確にLENGTHOF arrayB回回っています。それは間違っている、あなたは半分のためにループしたい。

また、XCHGコマンドが間違っています。交換の宛先はarrayBではなく、現在のインデックス+ 5にあります。これを修正する方法がわかります。

また、axとindex + 5番目の要素を交換すると、インデックス+ 5番目の要素の取得値をインデックスの第1位に書き戻す必要があります。

+0

メモリを持つXCHGも非常に遅い:暗黙の 'lock'プレフィックス。もしあなたが[ループが遅い](http://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-it-efficiently)を指摘するつもりなら)、あなたもそれを指摘するべきです。 –

+0

私は6,7,8,9,10を数えることができましたが、まだオフだと思います –

+1

デバッグ方法は分かりますか?プログラムをシングルステップ実行し、各ステップでレジスタ値を監視しますか?そうでない場合、すぐにどのように見つけてください。 –

関連する問題