【问题标题】:strlen in assembly, off by 1?汇编中的strlen,减1?
【发布时间】:2012-03-03 22:07:15
【问题描述】:

我编写了以下可从 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 

【问题讨论】:

  • 只是为了避免因使用不同的术语而引起的问题,“总是关闭 +1”是什么意思?你有一个包含 N 个字符的字符串,然后是一个 NULL,最后的计数返回 N+1?
  • 对!!!!!!我忘记了这个计数实际上占了 NULL 字符的事实!谢谢
  • 请注意,xor %edx, %edx 在您的功能中没有任何用途。
  • 在这里被一个人淘汰是非常健康的。 C 代码中没有比忘记额外的 0 更大的错误。

标签: assembly strlen i386


【解决方案1】:

您正在计算终止的零字符。要么从 -1 开始,要么在比较后递增。

【讨论】:

    【解决方案2】:

    在递增字符计数器 (eax) 之前尝试将当前字符与零 (cmpb $0x0, %dl) 进行比较,例如一个空字符串,您的函数将为该字符串返回 1,因为计数器在确保之前递增有有效的字符数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多