从汇编,段错误调用C函数

时间:2013-04-15 16:19:32

标签: c function pointers assembly nasm

我正在编写一个汇编函数来替换字符串中的字母,char by char,如果传递给函数的char(由函数指针param给出)返回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

1 个答案:

答案 0 :(得分:2)

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

遵循惯例,由于函数指针存储在字符后面,因此其地址为ebp + 16而不是28.地址是面向字节的,而不是面向位的。