.code32
.text
.globl _start
_start:
; .globl main
.extern printf
pushl %ebp
movl %esp, %ebp
; subl $4, %esp
movl 4(%ebp), %eax
; movl 12(%ebp), %ebx
; movl $0, %ecx
cmp $2, %eax
jne argCount
pushl %eax
pushl $msg2
call printf
add $8, %esp
movl %ebp, %esp
popl %ebp
; movl $1, %eax
; movl $0, %ebx
; int $0x80
call exit
argCount:
pushl %ebp
movl %esp, %ebp
pushl $msg3
call printf
add $4, %esp
movl %ebp, %esp
popl %ebp
ret
.data
; .asciz "Arg = %s"
msg2: .asciz "Arg Count = %d\n"
msg3: .asciz "This program takes 1 argument -> sizeOfArray\n"
コマンドラインの引数の数が2ではなく、私にセグメンテーションフォルトを与えた場合、関数argCountが正しく実行されるのはなぜですか?プログラムの全体的な制御フローは正しく動作しているようです。おそらく関数のプロローグやエピローグに何か問題がありますか?なぜこの機能は機能しますが、私にセグメンテーションフォルトを与えますか?
あなたが関数 'argCount'の代わりに、' call'に分岐する 'jne'を使用しています。あなたが 'main'(これも間違っています)を使わなかったという事実と相まって、クラッシュにつながります。実際には、戻りアドレスがスタック上のその場所にないので、 'main'であってもクラッシュします。 – Jester
jaxは正しいです。なぜなら、eaxの値が2と等しくない場合にのみargCountを実行したいからです。 – sdfsdfsdf
特殊な状況を除いて関数に 'jne'できないので正しくありません。現在の関数の中でラベルを作成するか、コードを書き換えて「呼び出し」できるようにします。 – Jester