2009-06-24 4 views
2

私は「プログラミングをやり直していきます。今私は最小回答として2を与える必要がありますが、私はエコー$を行うときに答えとして0を得る次のコードを持っていますか?アセンブリコード - 正しい答えが得られない


    .section .data 
    data_items: 
    .long 3,67,34,222,56,87,9,2,88,22,11,66,900,0 
    .section .text 
    .globl _start 
    _start: 
    movl $0,%edi 
    movl data_items(,%edi,4),%eax 
    movl %eax,%ebx 
    start_loop: 
    cmpl $0,%eax 
    je loop_exit 
incl %edi 
movl data_items(,%edi,4),%eax 
cmpl %ebx,%eax 
jg start_loop 
movl %eax,%ebx 
jmp start_loop 
loop_exit: 
     movl $1,%eax 
     int $0x80
+1

が効果的である、あなたは、コメントのトンを必要とします。一部の人は1行に1つを推奨していますが、これは多少かもしれませんが、それほど遠く離れているわけではありません。 – samoz

+2

IBMのために働いているとき、1986年に、アセンブリコードの行ごとに少なくとも1行のコメント行を持つように言われました。これは技術者の技術者がソースコードを読めるようにするための要件でした。 –

答えて

1

だけでなく、0は2未満あなたはEAXの値が現在EBXより大きい場合、あなたがゼロで終了コードとして使用されているようにも見えます、ループに戻ってJG'ingされているので

これらの行

cmpl $0,%eax 
je loop_exit 

だから、リストにゼロを打つ、この場合には、それは最低の点数及び組立プログラムにおける経験則として、終了条件

+0

非常に真実、私はちょうどデバッグ中に実現しました – kost

+0

ループは$ 0をebxに移動せずに終了します。 ebxはまだリストの中で最も低い値を持っています – Kieveli

+0

@ Kieveli:その時点でJGはループの先頭に戻らず、次の行はmovl%eax、%ebxです。出口 – curtisk

0

あなたは結果を印刷していません。あなたはデバッグする必要があります。 ebxは、ループが実行された後に答えを含みます。

私はint 0x80が外部関数を呼び出すことを知っていますが、詳細が何であるかわかりません。 OK ...素敵なpage on interrupt 0x80system call numbersによれば、$ 1は終了コードです。

結果を印刷しているようではありません。 [OK]を、print文の基本的な形式はこれです:

mov eax, <MEMORY POINTER TO STRING> 
int 21h 

あなたは、文字にあなたの結果を変換メモリに入れ、その後、「int型の21H」にメモリ位置に合格する必要があります呼び出しているだろうそれらを画面に印刷します。

these examplesの一部を試して、効果があるかどうかを確認してください。

コードをデバッグして、何が起こっているかを確認できますか?

+0

OPには 'echo $?'という言葉が書かれています。つまり、DOSのAPIではなく、Linuxのものです。また、彼は値を表示しませんが、終了ステータスとして返します。 –

+0

あなたは正しいです...それからebxに残っても大丈夫です。出口への第2引数として。 – Kieveli

+0

... =または最初の引数=) – Kieveli

関連する問題