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

Assembly strcmp评估哪些寄存器?x86汇编,assembly,x86,Assembly,X86,这似乎是常识,但我还没有在互联网上找到它 当一个程序 call <JMP.&msvcrt.strcmp> 呼叫 比较了哪些值?我不确定,因为cmp是规定的(cmp eax、ebp) 我知道如果有帮助,比较结果将返回到EAX寄存器中。您正在尝试将strcmp与汇编指令cmp关联。但它们是不同的东西。例如,在处理器级(汇编)中,CMPA、B比较两个不同的寄存器,并在一些标志中设置结果。标志是可以由其他指令(如jz,jnz)测试的位,然后根据所需意图重定向流 当您执行调用str

这似乎是常识,但我还没有在互联网上找到它

当一个程序

call <JMP.&msvcrt.strcmp>
呼叫
比较了哪些值?我不确定,因为cmp是规定的(cmp eax、ebp)


我知道如果有帮助,比较结果将返回到EAX寄存器中。

您正在尝试将
strcmp
与汇编指令
cmp
关联。但它们是不同的东西。例如,在处理器级(汇编)中,
CMPA、B
比较两个不同的寄存器,并在一些标志中设置结果。标志是可以由其他指令(如
jz
jnz
)测试的位,然后根据所需意图重定向流

当您执行
调用strcmp
时,实际上是在调用一个“高级函数”(与汇编相比是高级函数),该函数将执行大量操作来比较两个C样式字符串。一旦每个编译器/平台给出不同的机器指令结果,就不容易知道将使用哪些寄存器(可能会使用其中的许多寄存器)

如果你理解了这一点,你会发现事实上这并不重要,因为范式有点不同:

  • cmp
    是一种汇编指令
  • strcmp
    不是汇编指令,而是函数

“call”将控制转移到库例程strcmp的地址,strcmp不是一条内部汇编指令(如cmp)。因此,返回/比较的值取决于函数签名/语言、调用约定等。除非您擅长逆向工程,否则您很可能必须找到函数的原始原型,其中说明了传递参数的位置/方式/方式。我在另一个调试器中查看后更新了我的问题。这是msvcrt的strcmp,用于x86上的标准调用约定,参数在调用函数之前被推送到堆栈中。在x64上,某些参数可以改为在寄存器中传递。不久之前,您应该看到一些指令将x86的寄存器推送到堆栈上,或者x64的寄存器中出现一些移动(可能更难看到)。同样,如果没有确切的函数签名和系统架构,您无法正确识别使用了哪些值以及如何使用。即使这样,编译器也可以根据自己的感觉进行优化。我现在看到了推送到堆栈中的值,谢谢!谢谢,你的答案加上给出的注释意味着我需要查看堆栈上的值。