Module: D:\SOURCE\TMP\rcptr.cpp Group: 'DGROUP' CONST,CONST2,_DATA,_BSS Segment: rcptr_TEXT PARA 000001c0 bytes Comdat: far ::RCBPtr::RCBPtr() SEGMENT ANY 'rcptr_TEXT' 00000020 bytes template class RCPtr { T *t; unsigned *r; public: RCPtr() : t(0), r(0) {} RCPtr(const RCPtr &p) : t(p.t), r(p.r) { if(t) ++*r; } ~RCPtr() { if(r && --*r==0) { delete t; delete r; } } RCPtr& operator=(const RCPtr &p) { if(this==&p) return *this; if(r && --*r==0) { delete t; delete r; } t=p.t;r=p.r; if(r) ++*r; return *this; } void bind(T *p) { if(r && --*r==0) { delete t; delete r; } t=p; r=t?new unsigned(1):0; } T* operator->() const { return t; } T& operator*() const { return *t; } }; template class RCBPtr { T *t; unsigned *r; public: RCBPtr() : t(0), r(0) 0000 53 push bx 0001 89 c3 mov bx,ax 0003 8e da mov ds,dx 0005 c7 07 00 00 mov word ptr [bx],0000H 0009 c7 47 02 00 00 mov word ptr +2H[bx],0000H 000e c7 47 04 00 00 mov word ptr +4H[bx],0000H 0013 c7 47 06 00 00 mov word ptr +6H[bx],0000H {} 0018 5b pop bx 0019 cb retf 001a 89 c0 mov ax,ax 001c 89 c0 mov ax,ax 001e 89 c0 mov ax,ax No disassembly errors ------------------------------------------------------------ 0000 53 main_ push bx Comdat: far ::RCBPtr::RCBPtr( ::RCBPtr const far & ) SEGMENT ANY 'rcptr_TEXT' 00000040 bytes RCBPtr(const RCBPtr &p) 0000 56 push si 0001 89 c6 mov si,ax 0003 8e da mov ds,dx 0005 8e c1 mov es,cx : t(p.t), r(p.r) 0007 26 8b 07 mov ax,es:[bx] 000a 26 8b 57 02 mov dx,es:+2H[bx] 000e 89 04 mov [si],ax 0010 89 54 02 mov +2H[si],dx 0013 26 8b 47 04 mov ax,es:+4H[bx] 0017 26 8b 57 06 mov dx,es:+6H[bx] 001b 89 44 04 mov +4H[si],ax 001e 89 54 06 mov +6H[si],dx 0021 8b 5c 02 mov bx,+2H[si] { if(t) ++*r; } 0024 8b 04 mov ax,[si] 0026 85 db test bx,bx 0028 75 04 jne L26 002a 85 c0 test ax,ax 002c 74 08 je L27 002e 8b 5c 04 L26 mov bx,+4H[si] 0031 8e c2 mov es,dx 0033 26 ff 07 inc word ptr es:[bx] 0036 89 f0 L27 mov ax,si 0038 8c da mov dx,ds 003a 5e pop si 003b cb retf 003c 89 c0 mov ax,ax 003e 89 c0 mov ax,ax No disassembly errors ------------------------------------------------------------ 0001 52 push dx Comdat: far ::RCBPtr::~RCBPtr() SEGMENT ANY 'rcptr_TEXT' 00000046 bytes ~RCBPtr() { 0000 51 push cx 0001 56 push si 0002 89 c3 mov bx,ax 0004 89 d1 mov cx,dx if(r && --*r==0) { delete t; delete r; } 0006 8e da mov ds,dx 0008 8b 47 06 mov ax,+6H[bx] 000b 8b 57 04 mov dx,+4H[bx] 000e 85 c0 test ax,ax 0010 75 04 jne L28 0012 85 d2 test dx,dx 0014 74 29 je L29 0016 89 d6 L28 mov si,dx 0018 8e d8 mov ds,ax 001a ff 0c dec word ptr [si] 001c 8e d9 mov ds,cx 001e c5 77 04 lds si,dword ptr +4H[bx] 0021 83 3c 00 cmp word ptr [si],0000H 0024 75 19 jne L29 0026 8e d9 mov ds,cx 0028 8b 07 mov ax,[bx] 002a 8b 57 02 mov dx,+2H[bx] 002d 9a 00 00 00 00 call far void far operator delete( void far * ) 0032 8e d9 mov ds,cx 0034 8b 47 04 mov ax,+4H[bx] 0037 8b 57 06 mov dx,+6H[bx] 003a 9a 00 00 00 00 call far void far operator delete( void far * ) } RCBPtr& operator=(const RCBPtr &p) { if(this==&p) return *this; if(r && --*r==0) { delete t; delete r; } t=p.t;r=p.r; if(r) ++*r; return *this; } void bind(T *p) { if(r && --*r==0) { delete t; delete r; } t=p; r=t?new unsigned(1):0; } T& operator*() const { return *t; } }; 003f 89 d8 L29 mov ax,bx 0041 89 ca mov dx,cx 0043 5e pop si 0044 59 pop cx 0045 cb retf No disassembly errors ------------------------------------------------------------ 0002 56 push si 0003 57 push di 0004 55 push bp 0005 89 e5 mov bp,sp 0007 83 ec 10 sub sp,0010H void main(void) { RCBPtr p1; 000a 31 d2 xor dx,dx p1.bind(new int(7)); 000c b8 02 00 mov ax,0002H 000f 89 56 f0 mov -10H[bp],dx 0012 89 56 f2 mov -0eH[bp],dx 0015 89 56 f4 mov -0cH[bp],dx 0018 89 56 f6 mov -0aH[bp],dx 001b 9a 00 00 00 00 call far void far * far operator new( int unsigned ) 0020 89 c3 mov bx,ax 0022 85 d2 test dx,dx 0024 75 04 jne L1 0026 85 c0 test ax,ax 0028 74 0a je L2 002a 8e da L1 mov ds,dx 002c 89 c7 mov di,ax 002e c7 07 07 00 mov word ptr [bx],0007H 0032 eb 02 jmp L3 0034 89 c7 L2 mov di,ax 0036 89 d3 L3 mov bx,dx 0038 8b 46 f6 mov ax,-0aH[bp] 003b 8b 56 f4 mov dx,-0cH[bp] 003e 85 c0 test ax,ax 0040 75 04 jne L4 0042 85 d2 test dx,dx 0044 74 25 je L5 0046 8b 76 f4 L4 mov si,-0cH[bp] 0049 8e d8 mov ds,ax 004b ff 0c dec word ptr [si] 004d c5 76 f4 lds si,dword ptr -0cH[bp] 0050 83 3c 00 cmp word ptr [si],0000H 0053 75 16 jne L5 0055 8b 46 f0 mov ax,-10H[bp] 0058 8b 56 f2 mov dx,-0eH[bp] 005b 9a 00 00 00 00 call far void far operator delete( void far * ) 0060 8b 46 f4 mov ax,-0cH[bp] 0063 8b 56 f6 mov dx,-0aH[bp] 0066 9a 00 00 00 00 call far void far operator delete( void far * ) 006b 89 7e f0 L5 mov -10H[bp],di 006e 89 5e f2 mov -0eH[bp],bx 0071 85 db test bx,bx 0073 75 04 jne L6 0075 85 ff test di,di 0077 74 20 je L10 0079 b8 02 00 L6 mov ax,0002H 007c 9a 00 00 00 00 call far void far * far operator new( int unsigned ) 0081 89 c3 mov bx,ax 0083 85 d2 test dx,dx 0085 75 04 jne L7 0087 85 c0 test ax,ax 0089 74 08 je L8 008b 8e da L7 mov ds,dx 008d c7 07 01 00 mov word ptr [bx],0001H 0091 eb 02 jmp L9 0093 8e da L8 mov ds,dx 0095 89 de L9 mov si,bx 0097 eb 04 jmp L11 0099 31 f6 L10 xor si,si 009b 8e de mov ds,si RCBPtr p2=p1; 009d 8b 5e f0 L11 mov bx,-10H[bp] 00a0 89 76 f4 mov -0cH[bp],si 00a3 8c 5e f6 mov -0aH[bp],ds 00a6 89 76 fc mov -4H[bp],si 00a9 89 5e f8 mov -8H[bp],bx 00ac 8b 5e f2 mov bx,-0eH[bp] 00af 8c 5e fe mov -2H[bp],ds 00b2 89 5e fa mov -6H[bp],bx 00b5 85 db test bx,bx 00b7 75 06 jne L12 00b9 83 7e f0 00 cmp word ptr -10H[bp],0000H 00bd 74 02 je L13 00bf ff 04 L12 inc word ptr [si] *p2=24; ++*p1; 00c1 c5 5e f8 L13 lds bx,dword ptr -8H[bp] 00c4 c7 07 18 00 mov word ptr [bx],0018H p2.bind(new int(8)); 00c8 c5 5e f0 lds bx,dword ptr -10H[bp] 00cb 8b 37 mov si,[bx] 00cd 46 inc si 00ce b8 02 00 mov ax,0002H 00d1 89 37 mov [bx],si 00d3 9a 00 00 00 00 call far void far * far operator new( int unsigned ) 00d8 89 c3 mov bx,ax 00da 89 d6 mov si,dx 00dc 85 d2 test dx,dx 00de 75 04 jne L14 00e0 85 c0 test ax,ax 00e2 74 06 je L15 00e4 8e da L14 mov ds,dx 00e6 c7 07 08 00 mov word ptr [bx],0008H 00ea 8b 46 fe L15 mov ax,-2H[bp] 00ed 8b 56 fc mov dx,-4H[bp] 00f0 89 df mov di,bx 00f2 89 f3 mov bx,si 00f4 85 c0 test ax,ax 00f6 75 04 jne L16 00f8 85 d2 test dx,dx 00fa 74 25 je L17 00fc 8b 76 fc L16 mov si,-4H[bp] 00ff 8e d8 mov ds,ax 0101 ff 0c dec word ptr [si] 0103 c5 76 fc lds si,dword ptr -4H[bp] 0106 83 3c 00 cmp word ptr [si],0000H 0109 75 16 jne L17 010b 8b 46 f8 mov ax,-8H[bp] 010e 8b 56 fa mov dx,-6H[bp] 0111 9a 00 00 00 00 call far void far operator delete( void far * ) 0116 8b 46 fc mov ax,-4H[bp] 0119 8b 56 fe mov dx,-2H[bp] 011c 9a 00 00 00 00 call far void far operator delete( void far * ) 0121 89 7e f8 L17 mov -8H[bp],di 0124 89 5e fa mov -6H[bp],bx 0127 85 db test bx,bx 0129 75 04 jne L18 012b 85 ff test di,di 012d 74 1c je L20 012f b8 02 00 L18 mov ax,0002H 0132 9a 00 00 00 00 call far void far * far operator new( int unsigned ) 0137 89 c3 mov bx,ax 0139 89 d6 mov si,dx 013b 85 d2 test dx,dx 013d 75 04 jne L19 013f 85 c0 test ax,ax 0141 74 0c je L21 0143 8e da L19 mov ds,dx 0145 c7 07 01 00 mov word ptr [bx],0001H 0149 eb 04 jmp L21 014b 31 db L20 xor bx,bx 014d 31 f6 xor si,si 014f 89 5e fc L21 mov -4H[bp],bx 0152 89 76 fe mov -2H[bp],si } 0155 85 f6 test si,si 0157 75 04 jne L22 0159 85 db test bx,bx 015b 74 22 je L23 015d 8e de L22 mov ds,si 015f ff 0f dec word ptr [bx] 0161 c5 5e fc lds bx,dword ptr -4H[bp] 0164 83 3f 00 cmp word ptr [bx],0000H 0167 75 16 jne L23 0169 8b 46 f8 mov ax,-8H[bp] 016c 8b 56 fa mov dx,-6H[bp] 016f 9a 00 00 00 00 call far void far operator delete( void far * ) 0174 8b 46 fc mov ax,-4H[bp] 0177 8b 56 fe mov dx,-2H[bp] 017a 9a 00 00 00 00 call far void far operator delete( void far * ) 017f 8b 76 f6 L23 mov si,-0aH[bp] 0182 8b 7e f4 mov di,-0cH[bp] 0185 85 f6 test si,si 0187 75 04 jne L24 0189 85 ff test di,di 018b 74 25 je L25 018d 8b 5e f4 L24 mov bx,-0cH[bp] 0190 8e de mov ds,si 0192 ff 0f dec word ptr [bx] 0194 c5 5e f4 lds bx,dword ptr -0cH[bp] 0197 83 3f 00 cmp word ptr [bx],0000H 019a 75 16 jne L25 019c 8b 46 f0 mov ax,-10H[bp] 019f 8b 56 f2 mov dx,-0eH[bp] 01a2 9a 00 00 00 00 call far void far operator delete( void far * ) 01a7 8b 46 f4 mov ax,-0cH[bp] 01aa 8b 56 f6 mov dx,-0aH[bp] 01ad 9a 00 00 00 00 call far void far operator delete( void far * ) 01b2 89 ec L25 mov sp,bp 01b4 5d pop bp 01b5 5f pop di 01b6 5e pop si 01b7 5a pop dx 01b8 5b pop bx 01b9 cb retf 01ba 89 c0 mov ax,ax 01bc 89 c0 mov ax,ax 01be 89 c0 mov ax,ax No disassembly errors ------------------------------------------------------------ Comdat: char unsigned const far __typesig[] SEGMENT ANY 'rcptr_DATA1' 0000000f bytes 0000 00 - . 0001 00 00 00 00 DD far ::RCBPtr::RCBPtr() 0005 00 00 00 00 DD far ::RCBPtr::RCBPtr( ::RCBPtr const far & ) 0009 00 00 00 00 DD far ::RCBPtr::~RCBPtr() 000d 08 00 - .. No disassembly errors ------------------------------------------------------------