问一小段c语言编译出来的汇编,本人的汇编水平很次,请详细解答,谢谢!
代码如下:
_TEXT segment dword public use32 'CODE'
_fun proc near
?live1@0:
;
; int fun(int *a) {return ++(*a);}
;
push ebp
mov ebp,esp
@1:
mov eax,dword ptr [ebp+8]
inc dword ptr [eax]
mov eax,dword ptr [eax]
@3:
@2:
pop ebp
ret
_fun endp
_TEXT ends
_TEXT segment dword public use32 'CODE'
_main proc near
?live1@48:
;
; int main(int argc, char* argv[])
;
push ebp
mov ebp,esp
push ebx
;
; {
; static x = 47;
; int a = 3;
;
@4:
mov eax,3
;
; int b = (a*10) + (a=a+1);
;
?live1@80: ; EAX = a
inc eax
;
; int y = (10*(fun(&x)-46)) + (fun(&x)-46);
;
?live1@96: ;
push offset $aoidcaia
call _fun
pop ecx
mov ebx,eax
push offset $aoidcaia
call _fun
pop ecx
add eax,-46
add eax,eax
lea eax,dword ptr [eax+4*eax]
add ebx,eax
mov eax,ebx
add eax,-46
;
; printf("%d",y);
;
?live1@112: ; EAX = y
push eax
push offset s@
call _printf
add esp,8
;
; system("pause");
;
?live1@128: ;
push offset s@+3
call _system
pop ecx
;
; return 0;
;
xor eax,eax
;
; }
;
@6:
@5:
pop ebx
pop ebp
ret
_main endp
_TEXT ends
问题:
1.“?live1@48:”这个是什么意思?如果是行标记,为什么起这样的名字?
2.“call _fun”之后为什么要“pop ecx”?
3.我猜测 add eax,eax
lea eax,dword ptr [eax+4*eax]
是给eax乘10,但是具体是怎么实现的呢?
4.add ebx,eax
mov eax,ebx
为什么不直接写 add eax,ebx 呢?