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)