Я написал небольшой фрагмент сборки (Gas, 32 бит), который принимает аргумент командной строки, считает его символы и печатает строку, если она имеет определенную длину (только для целей отладки). Я относительно новичок в сборке, поэтому я почти уверен, что здесь есть что-то, что я пропускаю, потому что при сохранении строки в eax у меня другое поведение по сравнению, например, с ecx, edx или esi.
Вот фрагмент. Когда вы заменяете esi на eax, цикл вводится только дважды, независимо от длины строки, поэтому счетчик (ebx) всегда равен 1. В случае esi или других регистров все работает нормально.
.section .text
.globl _start
_start:
movl %esp, %ebp
movl 0(%ebp), %eax # get argc
cmpl $2, %eax # ensure argc == 2
jne _exit
movl 8(%ebp), %eax # get argv[1]
movl $0, %ebx # set counter to 0
_begin_loop:
movb (%eax), %al # load a character into %al
cmpb $0, %al # see if \0 is reached
je _end_loop # exit loop if at end of string
incl %ebc # increment counter
incl %eax # advance string
jmp _begin_loop
_end_loop:
cmpl $6, %ebx # print the string if it's six characters long
jne _exit
movl $4, %eax # prepare for output
movl $1, %ebx
movl 8(%ebp), %ecx)
movl $6, %edx
int 0x80
_exit:
movl $1, %eax
movl $0, %ebx
int 0x80
Кто-нибудь может дать мне подсказку о том, что я делаю неправильно / недоразумение?
Greets