strcmp评估哪些寄存器?x86汇编

4

看起来这似乎是常识,但我在互联网上找不到它的文字说明(至少目前还没有)。

当一个程序拥有

call <JMP.&msvcrt.strcmp>

需要比较哪些值?我不确定,因为在cmp中是这样说明的(cmp eax,ebp)。

如果有帮助的话,我知道比较的结果会在EAX寄存器中返回。


“call”指令将控制权转移到库例程“strcmp”的地址,它不是内置的汇编指令(如cmp)。因此,返回/比较的值取决于函数签名/语言、调用约定等。除非您擅长反向工程,否则您很可能需要找到函数的原始原型,以确定传递参数的方式/位置/类型。 - Shaggi
我在另一个调试器中查看后更新了我的问题。这是msvcrt的strcmp函数。 - user2059300
1
对于x86标准调用约定,函数调用之前参数被推送到堆栈中。在x64上,一些参数可以通过寄存器传递。在x86的情况下,您应该立即看到一些指令将寄存器推送到堆栈上,或者在x64的情况下移动寄存器(可能更难看到)。 同样,如果没有确切的函数签名和系统架构,您无法正确地确定使用了哪些值以及如何使用。即使有,编译器也可能按照自己的意愿进行优化。 - Shaggi
我现在看到值被推入堆栈了,谢谢! - user2059300
1个回答

7
你试图将strcmp与汇编指令cmp相关联,但它们是不同的东西。在处理器级别(汇编),cmp A,B比较2个不同的寄存器,并将结果设置在某些标志中。标志是可以被其他指令(如jz,jnz)测试的位,然后根据所需的意图重定向流程。
当你执行call strcmp时,你实际上调用一个“高级函数”(相对于汇编而言),该函数将执行大量操作以比较两个C风格字符串。很难知道将使用哪些寄存器(可能会使用许多寄存器),因为每个编译器/平台都会给出不同的机器指令结果。
如果你理解这一点,你就会发现实际上并不重要,因为范式有一点不同:
- cmp是一个汇编指令。 - strcmp不是汇编指令,而是一个函数。

谢谢,您的答案结合已经给出的评论意味着我需要查看放在堆栈上的值。 - user2059300

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接