楼主这段代码正好不需要处理栈帧即可很好的工作(因为没有分配函数的局部变量等与此类似的东西)。
能写这样代码的人应该是很好的理解了编译器是怎么处理内联汇编以及内联函数的。
我猜测这段代码是供VC用的,当然仅仅只是猜测而已。
我写了如下的测试代码,VC6,release方式:
#include <stdio.h>
#include <stdlib.h>
static __inline int MULSHIFT32(int x, int y)
{
__asm {
mov
eax, x
imul
y
mov
eax, edx
}
}
int main(void)
{
int a, b, c;
scanf("%d %d", &a, &b);
c = MULSHIFT32(a, b);
printf("%d\n", c);
return 0;
}
反汇编后:
00401000
/$
55
push
ebp
;
main
00401001
|.
8BEC
mov
ebp, esp
00401003
|.
83EC 08
sub
esp, 8
00401006
|.
8D45 F8
lea
eax, dword ptr [ebp-8]
00401009
|.
8D4D FC
lea
ecx, dword ptr [ebp-4]
0040100C
|.
50
push
eax
0040100D
|.
51
push
ecx
0040100E
|.
68 34804000
push
00408034
;
ASCII "%d %d"
00401013
|.
E8 59000000
call
<scanf>
00401018
|.
8B45 FC
mov
eax, dword ptr [ebp-4]
;
//内联函数 MULSHIFT32;[ebp-4]为a(注意,并不存在普通函数的值拷贝的问题)
0040101B
|.
F76D F8
imul
dword ptr [ebp-8]
;
[ebp-8]为b
0040101E
|.
8BC2
mov
eax, edx
;
\\
00401020
|.
50
push
eax
;
内联函数的结果,因为编译器优化的原因,所以找不到变量c了,也因此,地址401003处esp减去的是8(a和b各占4字节),而不是0x0C
00401021
|.
68 30804000
push
00408030
;
ASCII "%d",LF
00401026
|.
E8 15000000
call
<printf>
0040102B
|.
83C4 14
add
esp, 14
0040102E
|.
33C0
xor
eax, eax
00401030
|.
8BE5
mov
esp, ebp
00401032
|.
5D
pop
ebp
00401033
\.
C3
retn
这个帖子中有一段关于inline函数的说明,很中肯:
---- http://bbs.
[
本帖最后由 prankmoon 于 2009-8-18 13:00 编辑 ]