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