Windows下32位和64位函数参数调试分析

xingyun86 2021-7-8 830

Windows下32位和64位函数参数调试分析

一、以下是非浮点数参数存储

32位下:

在call指令前:ESP指向参数的首地址,根据实际参数尺寸获取四个字节或八个字节即可。

如果进入call(即函数体):这是ESP指向函数返回地址,ESP+4指向参数首地址。

64位下:

在call指令前:函数参数1,2,3,4分别存储在RCX,RDX,R8,R9四个寄存器中。参数5则是存储在RSP+0x20(即堆栈中,0x20=4*8,前四个参数寄存器的偏移值)

如果进入call(即函数体):这是RSP指向函数返回地址。函数参数1,2,3,4分别存储在RCX,RDX,R8,R9四个寄存器中。参数5则是存储在RSP+0x8(即堆栈中,0x8=1*8,返回地址一个八字节的偏移值)。

二、以下是浮点数参数存储

32位下:

在call指令前:ESP指向参数的首地址,根据实际参数尺寸获取四个字节或八个字节即可。

如果进入call(即函数体):这是ESP指向函数返回地址,ESP+4指向参数首地址。

64位下:

在call指令前:函数参数1,2,3,4分别存储在XMM0,XMM1,XMM2,XMM3四个寄存器中。参数5则是存储在RSP+0x20(即堆栈中,0x20=4*8,前四个参数寄存器的偏移值)

如果进入call(即函数体):这是RSP指向函数返回地址。函数参数1,2,3,4分别存储在XMM0,XMM1,XMM2,XMM3四个寄存器中。参数5则是存储在RSP+0x8(即堆栈中,0x8=1*8,返回地址一个八字节的偏移值)。

三、如果是浮点数参数和非浮点数参数混合使用

32位下:

在call指令前:ESP指向参数的首地址,根据实际参数尺寸获取四个字节或八个字节即可。

如果进入call(即函数体):这是ESP指向函数返回地址,ESP+4指向参数首地址。

64位下:

前四个寄存器及前四个参数调用原则:(第五个参数在内及以后的参数都在堆栈中存储获取)

非浮点数 : RCX(参数1),RDX(参数2),R8(参数3),R9(参数4)

浮点数 :XMM0(参数1),XMM1(参数2),XMM2(参数3),XMM3(参数4)


×
打赏作者
最新回复 (0)
只看楼主
全部楼主
返回