2012-10-27 32 views
3

我正在尝试解码从二进制生成的一些汇编代码的过程。有代码的sscanf函数的调用:sscanf如何工作? (在汇编中)

400f08:  e8 13 fc ff ff   callq 400b20 <[email protected]> 
400f0d:  89 45 fc    mov %eax,-0x4(%rbp) 

你能告诉我怎么sscanf作品汇编?我很确定参数的数量存储在%eax ....它是否将输入按相反顺序推入堆栈?所以说,我的输入为0 1,运行的sscanf,%eax = 2后,堆栈的样子:

1 
0 <----%rsp (top of the stack) 

这是正确的吗? 谢谢!

回答

4

按照平台的调用约定,照常。默认情况下,32位Linux使用cdecl,您可以按照相反的顺序将所有参数压入堆栈。 64位Linux使用系统V AMD64 ABI惯例,它使用RDIRSIRDXRCXR8,和R9为整数,并且地址和用于浮点参数(过剩参数会在堆栈上)的XMM寄存器。

参数的数量不会被推到任何地方; AFAIK sscanf从格式字符串中确定了这一点(尽管我很乐意予以纠正)。 System V AMD64 ABI(64位)确实指定AL用于存储所使用的XMM寄存器的数量(从0到8),但仅适用于浮点参数(不应该是sscanf的参数)。

1

sscanf需要作为参数字符串进行扫描,格式字符串,并指针变量在哪里存储扫描的结果。因此,假设扫描成功,您的0和1号码将被存储在相应的变量上。

EAX包含返回值。 *scanf函数系列返回扫描成功的元素数量,因此您可以知道扫描是否成功,以及它的成功程度。