Стрлен в сборе, выключен на 1? - PullRequest
1 голос
/ 04 марта 2012

Я написал следующую функцию сборки, вызываемую из C для подсчета длины строки с нулевым символом в конце. Но по какой-то причине счет всегда выключен на +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 

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

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

1 голос
/ 04 марта 2012

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

...