.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"
Почему функция argCount выполняется правильно, если аргумент count в командной строке не равен 2, но дает мне ошибку сегментации? По-видимому, общий поток управления программой работает некорректно. Возможно, что-то не так с прологом или эпилогом функции?Почему эта функция работает, но дает мне ошибку сегментации?
Вы можете использовать 'jne' расшириться к функции' argCount' вместо 'call'. В сочетании с тем, что вы не использовали 'main' (что также неправильно), это приведет к сбою. На самом деле это сбой даже с 'main', потому что адрес возврата находится не в этом месте в стеке. – Jester
jne является правильным, потому что я хочу, чтобы argCount выполнялся, если значение в eax не равно 2. – sdfsdfsdf
Неправильно, потому что вы не можете 'jne' для функции (за исключением особых случаев). Либо сделайте это ярлыком внутри вашей текущей функции, либо перепишите код, чтобы вы могли «позвонить» ему. – Jester