Я написал небольшой фрагмент сборки (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
Может ли кто-нибудь намекнуть мне, что я делаю неправильно / недопонимаю?
Приветствует