home *** CD-ROM | disk | FTP | other *** search
- ;void swap_strings(strg_1,strg_2);
- ; char *strg_1,*strg_2;
-
- EXTRN _memory_model:byte
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:_TEXT
- PUBLIC _swap_strings
- _swap_strings proc near
- mov bx,sp ;BX pts to stack
- push di ;
- push si ;
- push ds ;
- cmp _memory_model,0 ;near or far?
- jle begin ;jump if near
- inc bx ;else add 2 to BX
- inc bx ;
- begin: cmp _memory_model,2 ;data near or far?
- jb L0 ;jump if near
- lds si,ss:dword ptr[bx+2] ;DS:SI pts to strg_1
- les di,ss:dword ptr[bx+6] ;ES:DI pts to strg_2
- jmp short L1 ;
- L0: mov si,ss:[bx+2] ;NEAR case
- mov di,ss:[bx+4] ;
- mov ax,ds ;ES = DS
- mov es,ax ;
- L1: sub dx,dx ;when dh != 0 when end of strg_1, dl for strg_2
- L2: mov al,[si] ;get char from strg_1
- mov bl,es:[di] ;and char from strg_2
- mov [si],bl ;xchg
- mov es:[di],al ;
- inc di ;forward ptrs for next time
- inc si ;
- cmp al,0 ;null in strg_1?
- jne L3 ;jump if not
- inc dh ;inc flag
- L3: cmp bl,0 ;null in strg_2?
- jne L4 ;jump if not
- inc dl ;inc flag
- L4: cmp dh,0 ;have both ptrs hit a null?
- je L2 ;dh still zero, go get next char
- cmp dl,0 ;
- je L2 ;dl still zero, go get next
- pop ds ;finished
- pop si ;
- pop di ;
- cmp _memory_model,0 ;quit
- jle quit ;
- db 0CBh ;RET far
- quit: ret ;RET near
- _swap_strings ENDP
- _TEXT ENDS
- END