A 32-bit .ASM File, Produced by CSET/2
TITLE DEMO.C
.386
.387
INCLUDELIB OS2386.LIB
INCLUDELIB dde4nbs.lib
CODE32 SEGMENT DWORD USE32 PUBLIC 'CODE'
CODE32 ENDS
DATA32 SEGMENT DWORD USE32 PUBLIC 'DATA'
DATA32 ENDS
CONST32 SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST32 ENDS
BSS32 SEGMENT DWORD USE32 PUBLIC 'BSS'
BSS32 ENDS
DGROUP GROUP CONST32, BSS32, DATA32
ASSUME CS:FLAT, DS:FLAT, SS:FLAT, ES:FLAT
EXTRN DosAllocMem:PROC
EXTRN _printfieee:PROC
EXTRN _DosFlatToSel:PROC
EXTRN _DosSelToFlat:PROC
EXTRN _exeentry:PROC
DATA32 SEGMENT
@STAT1 DB "non-zero return code fro"
DB "m DosAllocMem=%d",0aH,0H
ALIGN 04H
@STAT2 DB "there are %u primes less"
DB " than 65536",0aH,0H
ALIGN 04H
@STAT3 DB "%6u ",0H
@STAT4 DB 0aH,0H
DD _exeentry
DATA32 ENDS
BSS32 SEGMENT
BSS32 ENDS
CONST32 SEGMENT
CONST32 ENDS
CODE32 SEGMENT
;***** 9 int gen(int *prime)
ALIGN 04H
PUBLIC gen
gen PROC
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
MOV [EBP+08H],EAX; prime
;***** 11 int ix,l=2,ll=25,npr=3,q,t,tp=2,tt;
MOV DWORD PTR [EBP-018H],019H; ll
MOV DWORD PTR [EBP-014H],03H; npr
MOV DWORD PTR [EBP-010H],02H; tp
;***** 12 prime[0]=2;
MOV DWORD PTR [EAX],02H
;***** 13 prime[1]=3;
MOV DWORD PTR [EAX+04H],03H
;***** 14 prime[2]=5;
MOV DWORD PTR [EAX+08H],05H
;***** 15 for ( t=7 ; t<65530 ; t+=tp )
MOV ECX,[EBP-01cH]; ix
MOV EBX,07H
MOV EDI,02H
ALIGN 04H
FELB6:
;***** 16 {
;***** 17 tp=6-tp;
MOV EDX,[EBP-010H]; tp
NEG EDX
ADD EDX,06H
MOV [EBP-010H],EDX; tp
;***** 18 if ( ll<=t )
CMP [EBP-018H],EBX; ll
JG FELB7
;***** 19 {
;***** 20 l++;
INC EDI
;***** 21 ll=prime[l]*prime[l];
MOV EDX,DWORD PTR [EAX+EDI*04H]
IMUL EDX,EDX
MOV [EBP-018H],EDX; ll
;***** 22 }
FELB7:
;***** 23 for ( ix=2 ; ix<l ; ix++ )
MOV ECX,02H
CMP EDI,02H
JLE FELB8
ALIGN 04H
FELB9:
MOV [EBP-020H],EDI; @CBE17
MOV ESI,EAX
;***** 24 {
;***** 25 q=t/prime[ix];
;***** 26 tt=q*prime[ix];
;***** 27 if ( t==tt ) break;
MOV EDI,DWORD PTR [ESI+ECX*04H]
MOV EAX,EBX
CDQ
IDIV EDI
MOV EDX,EDI
MOV EDI,[EBP-020H]; @CBE17
XCHG ESI,EAX
IMUL EDX,ESI
CMP EDX,EBX
JE FELB8
;***** 28 }
INC ECX
CMP ECX,EDI
JL FELB9
FELB8:
;***** 29 if ( l==ix ) prime[npr++]=t;
CMP EDI,ECX
JNE FELB12
MOV EDX,[EBP-014H]; npr
MOV DWORD PTR [EAX+EDX*04H],EBX
INC EDX
MOV [EBP-014H],EDX; npr
FELB12:
MOV EDX,EBX
;***** 30 }
MOV EBX,[EBP-010H]; tp
ADD EBX,EDX
CMP EBX,0fffaH
JL FELB6
;***** 31 return npr;
MOV EAX,[EBP-014H]; npr
POP EDI
POP ESI
POP EBX
LEAVE
RET
gen ENDP
;***** 34 int main(int argc, char *argv[])
ALIGN 04H
PUBLIC main
main PROC
PUSH EBX
PUSH ESI
PUSH EDI
SUB ESP,0cH
;***** 39 rc=DosAllocMem(&mem,16384,PAG_READ+PAG_WRITE+PAG_COMMIT);
PUSH 013H
PUSH 04000H
LEA ECX,[ESP+010H]; mem
PUSH ECX
MOV AL,03H
CALL DosAllocMem
ADD ESP,0cH
;***** 40 if ( rc ) return printf("non-zero return code from DosAllocMem=%d\n",rc);
OR EAX,EAX
JE FELB18
PUSH EAX
MOV EAX,OFFSET FLAT: @STAT1
SUB ESP,04H
CALL _printfieee
ADD ESP,014H
POP EDI
POP ESI
POP EBX
RET
FELB18:
;***** 41 last=gen(p=mem);
MOV EAX,[ESP+08H]; mem
MOV [ESP+04H],EAX; p
CALL gen
MOV ESI,EAX
;***** 42 printf("there are %u primes less than 65536\n",last);
PUSH ESI
MOV EAX,OFFSET FLAT: @STAT2
SUB ESP,04H
CALL _printfieee
MOV EAX,ESI
ADD ESP,08H
;***** 43 for ( ix=0 ; ix<last ; ix++ )
OR EAX,EAX
JLE FELB20
MOV EBX,EAX
MOV EDI,[ESP+04H]; p
XOR ESI,ESI
ALIGN 04H
FELB21:
;***** 44 {
;***** 45 printf("%6u ",p[ix]);
PUSH DWORD PTR [EDI+ESI*04H]
MOV EAX,OFFSET FLAT: @STAT3
SUB ESP,04H
CALL _printfieee
ADD ESP,08H
;***** 46 if ( 9==(ix%10) ) printf("\n");
MOV EAX,ESI
MOV ECX,0aH
CDQ
IDIV ECX
CMP EDX,09H
JNE FELB22
MOV EAX,OFFSET FLAT: @STAT4
CALL _printfieee
FELB22:
;***** 47 }
INC ESI
CMP ESI,EBX
JL FELB21
FELB20:
;***** 48 return 0;
XOR EAX,EAX
ADD ESP,0cH
POP EDI
POP ESI
POP EBX
RET
main ENDP
CODE32 ENDS
END
[Back: A 32-bit Map File]
[Next: Questions]