Другое поведение eax по сравнению с другими регистрами

Я написал небольшой фрагмент сборки (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

Может ли кто-нибудь намекнуть мне, что я делаю неправильно / недопонимаю?

Приветствует


person jena    schedule 30.12.2010    source источник


Ответы (1)


Регистр al на самом деле является младшими 8 битами регистра eax. Итак, инструкция movb (%eax), %al уничтожает 8 младших битов eax, то есть вашего указателя.

В качестве общего совета научитесь использовать отладчик для пошагового выполнения кода и определения того, где компьютер делает что-то отличное от того, что вы ожидаете.

РЕДАКТИРОВАТЬ: в опубликованном коде есть несколько тривиальных синтаксических ошибок (например, ebc вместо ebx), но я предполагаю некоторую ошибку копирования, поскольку вы говорите, что иначе это работает.

person Jester    schedule 30.12.2010
comment
Полный акк. Спасибо за объяснение, конечно, это правильный ответ. - person jena; 30.12.2010