2012-03-03 4 views
1

Я написал следующую функцию сборки, вызываемую из C, чтобы подсчитать длину строки с нулевым завершением. Но почему-то счет всегда выключен на +1. Я не могу понять, почему. Любая подсказка?strlen в сборе, выкл. 1?

Спасибо !!!

1 .text 
2 .globl _len 
3 _len: 
4   pushl %ebp    # set up stack frame 
5   movl %esp, %ebp   # save esp in ebp 
6   movl 8(%ebp), %ecx  # the beg of string 
7   xor %eax, %eax   # init length to 0 
8   
9 start: 
10   xor %edx, %edx   # char at this index 
11   movb (%ecx), %dl  # 
12   inc %eax 
13   inc %ecx 
14 
15   cmpb $0x0, %dl 
16   jne start 
17 end: 
18 
19   movl %ebp, %esp   # restore esp 
20   popl %ebp    # restore ebp 
21   ret 
22   .end 
23 
+1

Чтобы избежать проблем, возникающих из-за используемой терминологии, что означает «всегда выключено на +1»? У вас есть строка, содержащая N символов, а затем NULL, а счетчик в конце возвращает N + 1? – karatedog

+0

Правильно !!!!!! Я забыл тот факт, что этот счет фактически составлял символ NULL! Спасибо – user113454

+2

Обратите внимание, что 'xor% edx,% edx' не имеет никакой цели в вашей функции. –

ответ

2

Вы считаете завершающий нулевой символ. Начиная с -1 или приращения после сравнения.

1

Try сравнивая текущий символ с нулем (cmpb $0x0, %dl) перед приращением вашего счетчика символов (eax), взять, например, пустую строку, ваша функция возвращает 1 для этой строки, так как счетчик увеличиваются на единицу, прежде чем убедиться, что есть допустимые символы для подсчета.

 Смежные вопросы

  • Нет связанных вопросов^_^