2

我正在编写一个汇编函数来替换字符串中的字母,一个字符一个字符,如果该字符传递给一个函数(由函数指针参数给出),则返回 1。例如,如果 isVowel(c) 为特点。调用函数指针时出现段错误。我使用 ebx 作为字符串中要倒数的字符数。

使用 Linux、Nasm、x86

这是c中的汇编函数签名:

int strrepl(char *str, int c, int (* isinsubset) (int c) ) ;

如果我错了,请纠正我,但是:

- 字符串指针位于 ebp+8。
- 要替换​​的字符在ebp+12 中,占用4 个字节(16 位)。
-函数指针为ebp + 28;

调用表单组件的函数:

int isvowel (int c) {

   if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') 
      return 1 ;

   if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') 
      return 1 ;

   return 0 ;
}

这是我的实现

mov     edx, [ebp + 28]
mov     esi, [ebp + 8]
mov     eax, [esi + 4*ebx - 4]

之后 gdb 显示 eax = 0 。然后,

push    eax
call    edx

以上产生SEGFAULT

add     esp, 4
4

1 回答 1

2
  • 字符串指针位于 ebp+8。
  • 要替换的字符在 ebp+12 中,占用 4 个字节(16 位)。
  • 函数指针为ebp + 28;

按照您的约定,由于函数指针存储在字符之后,因此它的地址是ebp + 16而不是 28。地址是面向字节的而不是面向位的。

于 2013-04-15T16:26:05.147 回答