通常win32下三种不同的调用模式,不同版本的编译器,对汇编出来的代码都会代理一些差别。__cdecl是默认的方式,采用外平栈。__stdcall,采用内平栈。__fastcall,因为采用2个寄存器传参,所以多于2个参数后也会用外平栈的方式。
传入的第一个参数位置在ebp+8,后面依次加4个字节,即第n个参数的位置是ebp+8+(n-1)*4=ebp+4n+4。 函数内部的局部变量用开辟出来的栈帧的位置,无内部变量时会开辟0C0h大的栈帧空间,多一个变量多开辟0Ch。
n个变量会开辟0C0h+0Ch*n=(10h+n)*0Ch大小的空间。第一个局部变量位置是ebp-8,后面依次减0Ch个字节,第n个局部变量 的位置是ebp-8-0Ch*n。 对于参数或局部变量是浮点数的会用到xmm0和xmm1。
7: test(1, 2, 3, 4, 5, 6, 7, 8, 9);
00261811 push 9
00261813 push 8
00261815 push 7
00261817 push 6
00261819 push 5
0026181B push 4
0026181D push 3
0026181F push 2
00261821 sub esp,8
00261824 movsd xmm0,mmword ptr [__real@3ff0000000000000 (0267BD0h)]
0026182C movsd mmword ptr [esp],xmm0
00261831 call test (02613A2h)
00261836 add esp,28h
![](/i/l/?n=24&i=blog/1157565/202405/1157565-20240513233612892-879226468.png) 单精度浮点数怎么计算、储存? 单精度浮点数的计算方法可以参考下面这个公式:。其中,表示单精度浮点数,是符号位,占用1位,正数为0,负数为1。是指数位,占用8位,是尾数位,占用23位。 单精度浮点数在储存时占用32个二进制(bit)。具体储存方式为:最高位为符号位(Sigh),其中0代表正数,1为负数;第63-52位为偏移的指数位(Exponent),用于表示以2为底的指数,表示范围为(-1023,1024); 剩下的23位为尾数位(Mantissa)。 双精度浮点数的计算方式与单精度浮点数类似,都是采用科学计数法进行计算,即把一个数表示成的形式,其中是尾数(mantissa),是指数(exponent)。在双精度浮点数中,占用64位,占用11位,其中的正负各占5位,具体的存储格式如下: 符号位(Sign):1位,用于表示数字的正负。 指数位(Exponent):11位,用于表示中的。 尾数位(Fraction/Mantissa):52位,表示。
标签:汇编,单精度,代码,占用,win32,0Ch,ebp,push,浮点数 From: https://www.cnblogs.com/erhy/p/18190308