Below is the assembly source in MASM syntax with C comments
that pcc32 emits.
;File PI.c
;pcc32 version 1.0 release
title 'PI.c'
.486p
.model flat
.code
public _main
_main:
; Line 9: int main(int argc, char *argv[])
; Line 10: {
push 030D50h
call ___substackp
push ebx
push ebp
push esi
push edi
L_10:
; Line 13: clock_t ticks;
; Line 14:
; Line 15: printf("Begin of calculating Pi\n\n");
push offset L_1
call _printf
pop ecx
; Line 16:
; Line 17:
; Line 18: ticks = clock();
call dword ptr [__imp__clock]
mov dword ptr [esp-08h+030D60h],eax
; Line 19:
xor eax,eax
L_13:
; Line 21: r[l]=2;
mov dword ptr [esp+eax*4-02710Ch+030D60h],02h
L_16:
inc eax
; Line 20: for (l=0; l<=e; l++)
L_14:
cmp eax,09C40h
jle L_13
L_15:
xor eax,eax
L_17:
; Line 23: p[l]=0;
mov dword ptr [esp+eax*4-030D50h+030D60h],00h
L_20:
inc eax
; Line 22: for (l=0; l<=f; l++)
L_18:
cmp eax,02710h
jle L_17
L_19:
; Line 24:
; Line 25:
; Line 26:
mov eax,01h
mov dword ptr [esp-04h+030D60h],eax
L_21:
; Line 28: {
; Line 29: s=0;
xor ecx,ecx
mov ebx,09C40h
L_26:
; Line 31: {
; Line 32: a=i-1;
mov eax,ebx
dec eax
mov esi,eax
; Line 33: b=a*2+1;
mov eax,esi
shl eax,01h
inc eax
mov ebp,eax
; Line 34:
; Line 35: z=r[i]*10+s;
mov eax,dword ptr [esp+ebx*4-02710Ch+030D60h]
imul eax,0Ah
mov edi,eax
add edi,ecx
; Line 36: s=(z/b)*a;
mov ecx,ebp
mov eax,edi
mov edx,eax
sar edx,01Fh
cdq
idiv ecx
mov ecx,esi
imul ecx,eax
; Line 37: r[i]=z%b;
mov esi,ebp
mov eax,edi
mov edx,eax
sar edx,01Fh
cdq
idiv esi
mov dword ptr [esp+ebx*4-02710Ch+030D60h],edx
L_29:
dec ebx
mov eax,ebx
; Line 30: for (i=e; i>=2; i--)
L_27:
cmp ebx,02h
jge L_26
L_28:
; Line 38: }
; Line 39:
; Line 40: z=r[i]*10+s;
mov eax,dword ptr [esp+ebx*4-02710Ch+030D60h]
imul eax,0Ah
mov ebx,eax
add ebx,ecx
; Line 41: p[j]=z/10;
mov eax,ebx
mov edx,eax
sar edx,01Fh
mov ecx,0Ah
cdq
idiv ecx
mov ecx,dword ptr [esp-04h+030D60h]
mov dword ptr [esp+ecx*4-030D50h+030D60h],eax
; Line 42: r[1]=z%10;
mov eax,ebx
mov edx,eax
sar edx,01Fh
mov ecx,0Ah
cdq
idiv ecx
mov dword ptr [esp-02710Ch+04h+030D60h],edx
; Line 43:
; Line 44:
; Line 45: i=j;
mov eax,dword ptr [esp-04h+030D60h]
cmp dword ptr [esp+eax*4-030D50h+030D60h],09h
jle L_33
L_32:
; Line 47: {
; Line 48: p[i]=p[i]-10;
sub dword ptr [esp+eax*4-030D50h+030D60h],0Ah
; Line 49: i--;
dec eax
; Line 50: p[i]++;
inc dword ptr [esp+eax*4-030D50h+030D60h]
L_34:
; Line 46: while (p[i]>9)
cmp dword ptr [esp+eax*4-030D50h+030D60h],09h
jg L_32
L_33:
; Line 51: };
; Line 52:
; Line 53: if (j%1000==0)
mov eax,dword ptr [esp-04h+030D60h]
mov edx,eax
sar edx,01Fh
mov ecx,03E8h
cdq
idiv ecx
and edx,edx
jne L_37
; Line 54: printf("Got %5d digits of Pi\n", j);
mov eax,dword ptr [esp-04h+030D60h]
push eax
push offset L_2
call _printf
pop ecx
pop ecx
L_37:
; Line 55:
L_24:
inc dword ptr [esp-04h+030D60h]
; Line 27: for (j=1; j<=f; j++)
L_22:
cmp dword ptr [esp-04h+030D60h],02710h
jle offset L_21
L_23:
; Line 56: };
; Line 57: printf("\nEnd of calculating Pi\n\n");
push offset L_3
call _printf
pop ecx
; Line 58:
; Line 59: printf("in %lu ms\n", clock() - ticks);
mov eax,dword ptr [esp-08h+030D60h]
mov ebx,eax
call dword ptr [__imp__clock]
sub eax,ebx
push eax
push offset L_4
call _printf
pop ecx
pop ecx
; Line 60:
; Line 61:
; Line 62: #define LINE_LNG 100
; Line 63: stream = fopen("Pi.txt","w");
push offset L_6
push offset L_5
call _fopen
pop ecx
pop ecx
mov ebx,eax
; Line 64: setvbuf(stream, NULL, _IOFBF, 4096);
push 01000h
push 00h
push 00h
push ebx
call _setvbuf
add esp,010h
; Line 65:
xor edi,edi
xor esi,esi
L_39:
; Line 67: {
mov ebp,01h
L_44:
; Line 69: fprintf(stream,"%d",p[j*LINE_LNG+i]);
mov eax,edi
add eax,ebp
mov eax,dword ptr [esp+eax*4-030D50h+030D60h]
push eax
push offset L_7
push ebx
call _fprintf
add esp,0Ch
L_47:
inc ebp
; Line 68: for (i=1; i<=LINE_LNG; i++)
L_45:
cmp ebp,064h
jle L_44
L_46:
; Line 70: fprintf(stream,"\n");
push offset L_8
push ebx
call _fprintf
pop ecx
pop ecx
L_42:
add edi,064h
inc esi
; Line 66: for (j=0; j<=(f/LINE_LNG-1); j++)
L_40:
cmp edi,026ACh
jle L_39
L_41:
; Line 71: };
; Line 72: fclose(stream);
push ebx
call _fclose
pop ecx
; Line 73: printf("Printed Pi to Pi.txt\n\n");
push offset L_9
call _printf
pop ecx
; Line 74:
; Line 75: return 0;
xor eax,eax
; Line 76: }
L_11:
pop edi
pop esi
pop ebp
pop ebx
add esp,030D50h
ret
_string segment use32 public dword "string"
L_9:
db "Printed Pi to Pi.txt"
db 0Ah
db 0Ah
db 00h
L_8:
db 0Ah
db 00h
L_7:
db "%d"
db 00h
L_6:
db "w"
db 00h
L_5:
db "Pi.txt"
db 00h
L_4:
db "in %lu ms"
db 0Ah
db 00h
L_3:
db 0Ah
db "End of calculating Pi"
db 0Ah
db 0Ah
db 00h
L_2:
db "Got %5d digits of Pi"
db 0Ah
db 00h
L_1:
db "Begin of calculating Pi"
db 0Ah
db 0Ah
db 00h
_string ends
_const segment use32 public dword "const"
_const ends
.code
extrn ___substackp:proc
extrn __imp__clock:proc
extrn _setvbuf:proc
extrn _printf:proc
extrn _fprintf:proc
extrn _fopen:proc
extrn _fclose:proc
end
Manos.