A 16-Bit Code File
; Static Name Aliases
;
; $S180_inbuf EQU inbuf
TITLE DEMO.C
.286p
.287
DEMO_TEXT SEGMENT WORD PUBLIC 'CODE'
DEMO_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME CS: DEMO_TEXT, DS: DGROUP, SS: DGROUP
EXTRN __acrtused:ABS
EXTRN _printf:FAR
EXTRN _sscanf:FAR
EXTRN _fgets:FAR
_BSS SEGMENT
COMM NEAR _prime: 2: 5000
_BSS ENDS
EXTRN __iob:BYTE
_DATA SEGMENT
$SG188 DB 'there are %u primes less than 65536', 0aH, 00H
$SG191 DB '%u', 00H
$SG195 DB 'Enter number to factor: ', 00H
$SG197 DB '%u', 00H
$SG198 DB 'Unable to convert number. Please try again', 0aH, 00H
$SG207 DB '%u is prime', 0aH, 00H
$SG208 DB '%u=%u', 00H
$SG212 DB '*%u', 00H
$SG213 DB 0aH, 00H
_DATA ENDS
_BSS SEGMENT
$S180_inbuf DW 028H DUP (?)
_BSS ENDS
CONST SEGMENT
$T20004 DW SEG _prime
CONST ENDS
DEMO_TEXT SEGMENT
ASSUME CS: DEMO_TEXT
;|***
;|*** #include <stdio.h>
; Line 2
;|*** #define INBUFSIZE 80
;|*** #define NPRIME 5000
;|*** unsigned short prime[NPRIME];
;|***
;|*** int gen(void)
;|*** {
; Line 8
PUBLIC _gen
_gen PROC FAR
*** 000000 c8 24 00 00 enter WORD PTR 36,0
*** 000004 57 push di
*** 000005 56 push si
; ix = -6
; l = -16
; ll = -14
; npr = -2
; q = -4
; t = -10
; tp = -8
; tt = -12
;|*** unsigned short ix,l=2,ll=25,npr=3,q,t,tp=2,tt;
; Line 9
*** 000006 c7 46 f0 02 00 mov WORD PTR [bp-16],2 ;l
*** 00000b c7 46 f2 19 00 mov WORD PTR [bp-14],25 ;ll
*** 000010 c7 46 fe 03 00 mov WORD PTR [bp-2],3 ;npr
*** 000015 c7 46 f8 02 00 mov WORD PTR [bp-8],2 ;tp
;|*** prime[0]=2;
; Line 10
*** 00001a 8e 06 00 00 mov es,$T20004
*** 00001e 26 c7 06 00 00 02 00 mov WORD PTR es:_prime,2
;|*** prime[1]=3;
; Line 11
*** 000025 26 c7 06 02 00 03 00 mov WORD PTR es:_prime+2,3
;|*** prime[2]=5;
; Line 12
*** 00002c 26 c7 06 04 00 05 00 mov WORD PTR es:_prime+4,5
;|*** for ( t=7 ; t<65530 ; t+=tp )
; Line 13
*** 000033 c7 46 f6 07 00 mov WORD PTR [bp-10],7 ;t
*** 000038 c7 46 e2 04 00 mov WORD PTR [bp-30],OFFSET _prime+4
*** 00003d c7 46 e4 00 00 mov WORD PTR [bp-28],SEG _prime
*** 000042 c7 46 de 06 00 mov WORD PTR [bp-34],OFFSET _prime+6
*** 000047 c7 46 e0 00 00 mov WORD PTR [bp-32],SEG _prime
$L20002:
;|*** {
; Line 14
;|*** tp=6-tp;
; Line 15
*** 00004c b8 06 00 mov ax,6
*** 00004f 2b 46 f8 sub ax,WORD PTR [bp-8] ;tp
*** 000052 89 46 f8 mov WORD PTR [bp-8],ax ;tp
;|*** if ( ll<=t )
; Line 16
*** 000055 8b 46 f6 mov ax,WORD PTR [bp-10] ;t
*** 000058 39 46 f2 cmp WORD PTR [bp-14],ax ;ll
*** 00005b 77 15 ja $I170
;|*** {
; Line 17
;|*** l++;
; Line 18
*** 00005d 83 46 e2 02 add WORD PTR [bp-30],2
*** 000061 ff 46 f0 inc WORD PTR [bp-16] ;l
;|*** ll=prime[l]*prime[l];
; Line 19
*** 000064 c4 5e e2 les bx,DWORD PTR [bp-30]
*** 000067 26 8b 07 mov ax,WORD PTR es:[bx]
*** 00006a 89 46 dc mov WORD PTR [bp-36],ax
*** 00006d f7 e0 mul ax
*** 00006f 89 46 f2 mov WORD PTR [bp-14],ax ;ll
;|*** }
; Line 20
;|*** for ( ix=2 ; ix<l ; ix++ )
; Line 21
$I170:
*** 000072 be 02 00 mov si,2
*** 000075 39 76 f0 cmp WORD PTR [bp-16],si ;l
*** 000078 76 39 jbe $FB173
*** 00007a 8b 46 f6 mov ax,WORD PTR [bp-10] ;t
*** 00007d 89 46 ec mov WORD PTR [bp-20],ax
*** 000080 c7 46 ee 00 00 mov WORD PTR [bp-18],0
*** 000085 c7 46 e8 04 00 mov WORD PTR [bp-24],OFFSET _prime+4
*** 00008a c7 46 ea 00 00 mov WORD PTR [bp-22],SEG _prime
*** 00008f c4 7e e8 les di,DWORD PTR [bp-24]
$L20000:
;|*** {
; Line 22
;|*** q=t/prime[ix];
; Line 23
*** 000092 26 8b 0d mov cx,WORD PTR es:[di]
*** 000095 8b 46 ec mov ax,WORD PTR [bp-20]
*** 000098 8b 56 ee mov dx,WORD PTR [bp-18]
*** 00009b f7 f1 div cx
*** 00009d 89 46 fc mov WORD PTR [bp-4],ax ;q
;|*** tt=q*prime[ix];
; Line 24
*** 0000a0 f7 e1 mul cx
*** 0000a2 89 46 f4 mov WORD PTR [bp-12],ax ;tt
;|*** if ( t==tt ) break;
; Line 25
*** 0000a5 39 46 f6 cmp WORD PTR [bp-10],ax ;t
*** 0000a8 74 09 je $FB173
*** 0000aa 83 c7 02 add di,2
*** 0000ad 46 inc si
*** 0000ae 39 76 f0 cmp WORD PTR [bp-16],si ;l
*** 0000b1 77 df ja $L20000
$FB173:
;|*** }
;|*** if ( l==ix ) prime[npr++]=t;
; Line 27
*** 0000b3 39 76 f0 cmp WORD PTR [bp-16],si ;l
*** 0000b6 75 10 jne $I175
*** 0000b8 c4 5e de les bx,DWORD PTR [bp-34]
*** 0000bb 8b 46 f6 mov ax,WORD PTR [bp-10] ;t
*** 0000be 26 89 07 mov WORD PTR es:[bx],ax
*** 0000c1 83 46 de 02 add WORD PTR [bp-34],2
*** 0000c5 ff 46 fe inc WORD PTR [bp-2] ;npr
;|*** }
; Line 28
$I175:
*** 0000c8 8b 46 f8 mov ax,WORD PTR [bp-8] ;tp
*** 0000cb 01 46 f6 add WORD PTR [bp-10],ax ;t
*** 0000ce 83 7e f6 fa cmp WORD PTR [bp-10],-6 ;t
*** 0000d2 73 03 jae $JCC210
*** 0000d4 e9 75 ff jmp $L20002
$JCC210:
*** 0000d7 89 76 fa mov WORD PTR [bp-6],si ;ix
;|*** return npr;
; Line 29
*** 0000da 8b 46 fe mov ax,WORD PTR [bp-2] ;npr
*** 0000dd 5e pop si
*** 0000de 5f pop di
*** 0000df c9 leave
*** 0000e0 cb ret
*** 0000e1 90 nop
_gen ENDP
;|*** }
;|***
;|*** int main(int argc, char *argv[])
;|*** {
; Line 33
PUBLIC _main
_main PROC FAR
*** 0000e2 c8 60 00 00 enter WORD PTR 96,0
*** 0000e6 57 push di
*** 0000e7 56 push si
; argc = 6
; argv = 8
; ix = -6
; last = -10
; nf = -8
; fact = -76
; input = -2
; is = -12
; q = -4
;|*** static char inbuf[INBUFSIZE];
;|*** int ix,last,nf;
;|*** unsigned short fact[32],input=0,is,q;
; Line 36
*** 0000e8 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;input
;|*** last=gen();
; Line 37
*** 0000ed 0e push cs
*** 0000ee e8 00 00 call NEAR PTR _gen
*** 0000f1 89 46 f6 mov WORD PTR [bp-10],ax ;last
;|*** printf("there are %u primes less than 65536\n",last);
; Line 38
*** 0000f4 50 push ax
*** 0000f5 1e push ds
*** 0000f6 68 00 00 push OFFSET DGROUP:$SG188
*** 0000f9 9a 00 00 00 00 call FAR PTR _printf
*** 0000fe 83 c4 06 add sp,6
;|*** if ( 1<argc )
; Line 39
*** 000101 83 7e 06 01 cmp WORD PTR [bp+6],1 ;argc
*** 000105 7e 25 jle $I190
;|*** if ( 0==sscanf(argv[1],"%u",&input) ) argc=1;
; Line 40
*** 000107 8d 46 fe lea ax,WORD PTR [bp-2] ;input
*** 00010a 16 push ss
*** 00010b 50 push ax
*** 00010c 1e push ds
*** 00010d 68 25 00 push OFFSET DGROUP:$SG191
*** 000110 c4 5e 08 les bx,DWORD PTR [bp+8] ;argv
*** 000113 26 ff 77 06 push WORD PTR es:[bx+6]
*** 000117 26 ff 77 04 push WORD PTR es:[bx+4]
*** 00011b 9a 00 00 00 00 call FAR PTR _sscanf
*** 000120 83 c4 0c add sp,12
*** 000123 0b c0 or ax,ax
*** 000125 75 05 jne $I190
*** 000127 c7 46 06 01 00 mov WORD PTR [bp+6],1 ;argc
;|*** while ( 2>argc )
; Line 41
$I190:
*** 00012c 83 7e 06 02 cmp WORD PTR [bp+6],2 ;argc
*** 000130 7d 4b jge $FB194
*** 000132 8b 76 06 mov si,WORD PTR [bp+6] ;argc
$L20005:
;|*** {
; Line 42
;|*** printf("Enter number to factor: ");
; Line 43
*** 000135 1e push ds
*** 000136 68 28 00 push OFFSET DGROUP:$SG195
*** 000139 9a 00 00 00 00 call FAR PTR _printf
*** 00013e 83 c4 04 add sp,4
;|*** fgets(inbuf,INBUFSIZE,stdin);
; Line 44
*** 000141 1e push ds
*** 000142 68 00 00 push OFFSET __iob
*** 000145 6a 50 push 80
*** 000147 1e push ds
*** 000148 68 00 00 push OFFSET DGROUP:$S180_inbuf
*** 00014b 9a 00 00 00 00 call FAR PTR _fgets
*** 000150 83 c4 0a add sp,10
;|*** if ( 0==sscanf(inbuf,"%u",&input) )
; Line 45
*** 000153 8d 46 fe lea ax,WORD PTR [bp-2] ;input
*** 000156 16 push ss
*** 000157 50 push ax
*** 000158 1e push ds
*** 000159 68 41 00 push OFFSET DGROUP:$SG197
*** 00015c 1e push ds
*** 00015d 68 00 00 push OFFSET DGROUP:$S180_inbuf
*** 000160 9a 00 00 00 00 call FAR PTR _sscanf
*** 000165 83 c4 0c add sp,12
*** 000168 0b c0 or ax,ax
*** 00016a 75 11 jne $FB194
;|*** printf("Unable to convert number. Please try again\n");
; Line 46
*** 00016c 1e push ds
*** 00016d 68 44 00 push OFFSET DGROUP:$SG198
*** 000170 9a 00 00 00 00 call FAR PTR _printf
*** 000175 83 c4 04 add sp,4
;|*** else break;
;|*** }
; Line 48
*** 000178 83 fe 02 cmp si,2
*** 00017b 7c b8 jl $L20005
$FB194:
;|*** for ( ix=nf=0,is=input ; ix<last ; ix++ )
; Line 49
*** 00017d 2b c0 sub ax,ax
*** 00017f 89 46 f8 mov WORD PTR [bp-8],ax ;nf
*** 000182 89 46 fa mov WORD PTR [bp-6],ax ;ix
*** 000185 8b 46 fe mov ax,WORD PTR [bp-2] ;input
*** 000188 89 46 f4 mov WORD PTR [bp-12],ax ;is
*** 00018b 83 7e f6 00 cmp WORD PTR [bp-10],0 ;last
*** 00018f 7f 03 jg $JCC399
*** 000191 e9 8e 00 jmp $FB202
$JCC399:
*** 000194 8b 46 fa mov ax,WORD PTR [bp-6] ;ix
*** 000197 d1 e0 shl ax,1
*** 000199 05 00 00 add ax,OFFSET _prime
*** 00019c 89 46 a6 mov WORD PTR [bp-90],ax
*** 00019f c7 46 a8 00 00 mov WORD PTR [bp-88],SEG _prime
*** 0001a4 8d 46 b4 lea ax,WORD PTR [bp-76] ;fact
*** 0001a7 89 46 a2 mov WORD PTR [bp-94],ax
*** 0001aa 8c 56 a4 mov WORD PTR [bp-92],ss
*** 0001ad 8b 46 f6 mov ax,WORD PTR [bp-10] ;last
*** 0001b0 2b 46 fa sub ax,WORD PTR [bp-6] ;ix
*** 0001b3 89 46 a0 mov WORD PTR [bp-96],ax
*** 0001b6 01 46 fa add WORD PTR [bp-6],ax ;ix
*** 0001b9 8b 4e fe mov cx,WORD PTR [bp-2] ;input
$L20008:
;|*** {
; Line 50
;|*** q=input/prime[ix];
; Line 51
*** 0001bc c4 5e a6 les bx,DWORD PTR [bp-90]
*** 0001bf 26 8b 07 mov ax,WORD PTR es:[bx]
*** 0001c2 89 46 aa mov WORD PTR [bp-86],ax
*** 0001c5 8b c1 mov ax,cx
*** 0001c7 2b d2 sub dx,dx
*** 0001c9 f7 76 aa div WORD PTR [bp-86]
*** 0001cc 89 46 fc mov WORD PTR [bp-4],ax ;q
;|*** while ( q*prime[ix]==input )
; Line 52
*** 0001cf 8b 46 aa mov ax,WORD PTR [bp-86]
*** 0001d2 f7 66 fc mul WORD PTR [bp-4] ;q
*** 0001d5 3b c1 cmp ax,cx
*** 0001d7 75 3d jne $FB205
*** 0001d9 26 8b 07 mov ax,WORD PTR es:[bx]
*** 0001dc 89 46 b2 mov WORD PTR [bp-78],ax
*** 0001df 8b f0 mov si,ax
*** 0001e1 8b 46 a2 mov ax,WORD PTR [bp-94]
*** 0001e4 8b 56 a4 mov dx,WORD PTR [bp-92]
*** 0001e7 89 46 ac mov WORD PTR [bp-84],ax
*** 0001ea 89 56 ae mov WORD PTR [bp-82],dx
*** 0001ed c4 7e ac les di,DWORD PTR [bp-84]
$L20006:
;|*** {
; Line 53
;|*** fact[nf++]=prime[ix];
; Line 54
*** 0001f0 26 89 35 mov WORD PTR es:[di],si
*** 0001f3 83 c7 02 add di,2
*** 0001f6 83 46 a2 02 add WORD PTR [bp-94],2
*** 0001fa ff 46 f8 inc WORD PTR [bp-8] ;nf
;|*** input/=prime[ix];
; Line 55
*** 0001fd 8b c1 mov ax,cx
*** 0001ff 2b d2 sub dx,dx
*** 000201 f7 f6 div si
*** 000203 8b c8 mov cx,ax
;|*** q=input/prime[ix];
; Line 56
*** 000205 2b d2 sub dx,dx
*** 000207 f7 f6 div si
*** 000209 89 46 fc mov WORD PTR [bp-4],ax ;q
;|*** }
; Line 57
*** 00020c 8b 46 b2 mov ax,WORD PTR [bp-78]
*** 00020f f7 66 fc mul WORD PTR [bp-4] ;q
*** 000212 3b c1 cmp ax,cx
*** 000214 74 da je $L20006
$FB205:
;|*** }
; Line 58
*** 000216 83 46 a6 02 add WORD PTR [bp-90],2
*** 00021a ff 4e a0 dec WORD PTR [bp-96]
*** 00021d 75 9d jne $L20008
*** 00021f 89 4e fe mov WORD PTR [bp-2],cx ;input
$FB202:
;|*** if ( nf<2 ) return printf("%u is prime\n",is);
; Line 59
*** 000222 83 7e f8 02 cmp WORD PTR [bp-8],2 ;nf
*** 000226 7d 14 jge $I206
*** 000228 ff 76 f4 push WORD PTR [bp-12] ;is
*** 00022b 1e push ds
*** 00022c 68 70 00 push OFFSET DGROUP:$SG207
*** 00022f 9a 00 00 00 00 call FAR PTR _printf
*** 000234 83 c4 06 add sp,6
*** 000237 5e pop si
*** 000238 5f pop di
*** 000239 c9 leave
*** 00023a cb ret
*** 00023b 90 nop
$I206:
*** 00023c ff 76 b4 push WORD PTR [bp-76] ;fact
*** 00023f ff 76 f4 push WORD PTR [bp-12] ;is
*** 000242 1e push ds
*** 000243 68 7d 00 push OFFSET DGROUP:$SG208
*** 000246 9a 00 00 00 00 call FAR PTR _printf
*** 00024b 83 c4 08 add sp,8
;|*** printf("%u=%u",is,fact[0]);
;|*** for ( ix=1 ; ix<nf ; ix++ )
; Line 61
*** 00024e c7 46 fa 01 00 mov WORD PTR [bp-6],1 ;ix
*** 000253 83 7e f8 01 cmp WORD PTR [bp-8],1 ;nf
*** 000257 7e 29 jle $FB211
*** 000259 8d 46 b6 lea ax,WORD PTR [bp-74]
*** 00025c 89 46 a2 mov WORD PTR [bp-94],ax
*** 00025f 8c 56 a4 mov WORD PTR [bp-92],ss
*** 000262 8b 76 f8 mov si,WORD PTR [bp-8] ;nf
*** 000265 4e dec si
*** 000266 01 76 fa add WORD PTR [bp-6],si ;ix
$L20010:
;|*** printf("*%u",fact[ix]);
; Line 62
*** 000269 c4 5e a2 les bx,DWORD PTR [bp-94]
*** 00026c 26 ff 37 push WORD PTR es:[bx]
*** 00026f 1e push ds
*** 000270 68 83 00 push OFFSET DGROUP:$SG212
*** 000273 9a 00 00 00 00 call FAR PTR _printf
*** 000278 83 c4 06 add sp,6
*** 00027b 83 46 a2 02 add WORD PTR [bp-94],2
*** 00027f 4e dec si
*** 000280 75 e7 jne $L20010
$FB211:
;|*** return printf("\n");
; Line 63
*** 000282 1e push ds
*** 000283 68 87 00 push OFFSET DGROUP:$SG213
*** 000286 9a 00 00 00 00 call FAR PTR _printf
*** 00028b 83 c4 04 add sp,4
*** 00028e 5e pop si
*** 00028f 5f pop di
*** 000290 c9 leave
*** 000291 cb ret
_main ENDP
DEMO_TEXT ENDS
END
;|*** }
[Back: A 16-bit Map File]
[Next: Questions]