我正在编写一个汇编函数来替换字符串中的字母,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
答案 0 :(得分:2)
- 字符串指针位于ebp + 8。
- 要替换的字符在ebp + 12中,占用4个字节(16位)。
- 函数指针是ebp + 28;
遵循惯例,由于函数指针存储在字符后面,因此其地址为ebp + 16
而不是28.地址是面向字节的,而不是面向位的。