gpt4 book ai didi

c - 在 C 中返回 char* 的 x86 函数

转载 作者:行者123 更新时间:2023-11-30 18:27:08 25 4
gpt4 key购买 nike

我想在 x86 中编写一个函数,该函数将从 C 程序中调用。
该函数应如下所示:

char *remnth(char *s, int n);

我希望它从字符串 s 中删除每第 n 个字母并返回该字符串。这是我的 remnth.s 文件:

section.text
global remnth

remnth:
; prolog
push ebp
mov ebp, esp

; procedure
mov eax, [ebp+8]; Text in which I'm removing every nth letter
mov ebx, [ebp+12]; = n
mov ecx, [ebp+8] ; pointer to next letter (replacement)


lopext:
mov edi, [ebp+12] ; edi = n //setting counter
dec edi ; edi-- //we don't go form 'n' to '1' but from 'n-1' to '0'
lop1:
mov cl, [ecx] ; letter which will be a replacement
mov byte [eax], cl ; replace
test cl,cl ; was the replacement equal to 0?
je exit ; if yes that means the function is over
inc eax ; else increment pointer to letter which will be replaced
inc ecx ; increment pointer to letter which is a replacement
dec edi ; is it already nth number?
jne lop1 ; if not then repeat the loop
inc ecx ; else skip that letter by proceeding to the next one
jmp lopext ; we need to set counter (edi) once more

exit:
; epilog

pop ebp
ret

问题是,当我在 C 中从 main() 调用此函数时,出现段错误(核心已转储)

据我所知,这与指针高度相关,在本例中我返回 *char,并且因为我看到了一些返回 int 和它们工作得很好,我怀疑我忘记了正确返回 *char 的一些重要内容。

这就是我的 C 文件的样子:

#include <stdio.h>

extern char *remnth(char *s,int n);

int main()
{
char txt[] = "some example text\0";

printf("orginal = %s\n",txt);
printf("after = %s\n",remnth(txt,3));

return 0;
}

任何帮助将不胜感激。

最佳答案

您使用ecx作为指针,使用cl作为工作寄存器。由于 clecx 的低 8 位,因此您使用 mov cl, [ecx] 指令会损坏指针。您需要更改其中之一。通常,al/ax/eax/rax 用于临时工作寄存器,因为某些访问累加器使用较短的指令序列。如果您使用 al 作为工作寄存器,则需要避免使用 eax 作为指针,而是使用不同的寄存器(记住在必要时保留其内容)。

关于c - 在 C 中返回 char* 的 x86 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59239842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com