gpt4 book ai didi

c - 汇编 x86-32 和一些 c 函数

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

我从来没有学过C语言,所以这让我很困惑。我只是想知道我是否做对了或者哪里需要改进。对于此代码,我使用了程序集 x86 32 位。谢谢

这就是我应该做的:写一个带有签名的程序

char *strchar(char *s1, char c1)

返回一个指向字符串 s1 中第一次出现的字符 c1 的指针,如果没有找到,则返回 null。

这就是我的结论:

strchar   (char*, char):  
push ebp
mov ebp, esp
mov dword ptr [ebp-24], edi
mov EAX , esi
mov BYTE PTR [ebp-28], al

.L5:
mov EAX , dword ptr [ebp-24]
movzx EAX , byte ptr [ EAX ]
test AL, AL
je .L2
mov EAX , dword PTR [ebp-24]
movzx EAX , BYTE PTR [ EAX ]
cmp BYTE PTR [ebp-28], al
jne .L3
mov eax, dword PTR [ebp-24]
jmp .L6

.L3:
add dword PTR [ebp-24], 1
jmp .L5
.L2:
LEA eax, [ebp-9]
MOV DWORD PTR [EBP-8], eax
MOV EAX, DWORD PTR [ebp-8]

.L6:
POP EBP
RET

最佳答案

行:

mov       dword       ptr     [ebp-24], edi
mov EAX , esi
mov BYTE PTR [ebp-28], al

假设已经为此函数分配了一个堆栈帧,但事实并非如此;我认为你应该有这样的东西:

子特别是,32

之后

mov   ebp,esp

此外,L2 之后的三行似乎很困惑。到达 L2 的唯一方法是如果在字符串中发现 nil (0) 字节,此时代码应返回 NULL 指针。代码 (L6) 中的退出路径不影响 eax,因此需要的只是:

L2:
mov eax, 0

如果您保持别名最新,可能会使调试更容易;所以:

L2:
mov eax, 0
mov [ebp-24], eax

此外,这里使用的调用约定有点奇怪:字符串在 edi 中传递,字符在 esi 中传递。通常,在 x86-32 中,这些都将在堆栈上传递。这看起来可能是 x86-64 代码,转换为 x86-32....

最后一点;该汇编代码看起来像是禁用优化的编译器的输出。通常,生成启用优化的程序集会生成更易于理解的代码。例如,这段代码可以写得更简洁,如下所示,甚至不会变成奇怪的英特尔操作:

strchar:
mov edx, esi
mov eax, edi
L:
mov dh, [eax]
test dh, dh
jz null
cmp dh, dl
je done
inc eax
jmp L
null:
mov eax, 0
done:
ret

关于c - 汇编 x86-32 和一些 c 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53480110/

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