2016-05-02 18 views
0

空の5整数配列xarrを1から5の数字に置き換える必要があります。コードがコンパイルされ、この最後の部分を除いて正しいと思います。私の出力は12345で、これが私の必要なものです。しかし、私は最後に一度だけprint関数を使うことになっています。出力12345は水平ではなく、垂直(1度に1つ)でなければなりません。アセンブリー80386の配列に値を挿入する方法は?

.globl _asm_main 


.section .data, "" 

.section .bss, "" 
xarr: .fill 5, 4, 0 

.section .text, "" 
_asm_main: 
    enter $0, $0  # set up stack frame 
    pusha   # save registers 

    movl $1, %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 
    incl %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 
    incl %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 
    incl %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 
    incl %edi 
    movl %edi, xarr(, %edi, 4) 
    movl xarr(, %edi, 4), %eax 
    call print_int 

    popa   # restore registers 
    movl $0, %eax # return program status in eax 
    leave   # restore stack frame 
    ret 
+1

フォーマットをごめんね、申し訳ありません。すべてのコードを選択し、{}ボタンをクリックします。 –

+0

ほんとうにありがとうございました。 –

+1

_8088_?これは(少なくとも)80386のように見えます。とにかく、あなたのコードのどこにでも 'xarr'に書き込むことはありません。 – Michael

答えて

0

非常に最後のmov命令によると、それは次のようになります。

movl from_where, to_where 

1がゼロに%eaxから動くことができないためです。

したがって、オペランドの順序は、もう一方のmovになります。

movl xarr(, %edi, 4), %eax  # read from the array 
movl %edi, xarr(, %edi, 4)  # write into the array; note the %edi instead of the %eax 

各ポイントに含まれる各項目に注意してください。 %eaxを初期化するのではなく、その値を配列に書き込むようです。

おそらくこのプログラムをC言語で書いて慎重にテストし、コンパイラにそれをアセンブラに翻訳させてから、生成されたコードを見てください。

ところで、アセンブラ言語では、コメントは通常すべて同じ列から開始するように記述されています。

+0

私は混乱しています、ゼロは%eaxレジスタに移動されています。このコードの骨組みは、あらかじめ私たちに提供されていました。私たちは、pushaとpopaの間の.textセクションを編集するだけでよいはずです。最終的なmov命令の前に結果を印刷しています。 –

+0

答えを更新しました。 –

+0

これは私を助けました。私たちの先生はC/C++でのプログラミングについて言及した後、オブジェクトファイルを抽出することは可能ですが、実際にはC#にしか触れていませんでした。あなたは私の更新された説明を読んで、さらに助言してくれますか?そして、私はeaxをどのように初期化すべきですか? –

関連する問題