📄 asmsupt.asm
字号:
; File:; asmsupt.asm; Description:; Assembly support routines for miscellaneous functions;; Copyright (c) 1995, 1998; Pasquale J. Villani; All Rights Reserved;; This file is part of DOS-C.;; DOS-C is free software; you can redistribute it and/or; modify it under the terms of the GNU General Public License; as published by the Free Software Foundation; either version; 2, or (at your option) any later version.;; DOS-C is distributed in the hope that it will be useful, but; WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See; the GNU General Public License for more details.;; You should have received a copy of the GNU General Public; License along with DOS-C; see the file COPYING. If not,; write to the Free Software Foundation, 675 Mass Ave,; Cambridge, MA 02139, USA.;; version 1.4 by tom.ehlert@ginko.de; added some more functions; changed bcopy, scopy, sncopy,...; to memcpy, strcpy, strncpy; Bart Oldeman: optimized a bit: see /usr/include/bits/string.h from ; glibc 2.2;; $Id: asmsupt.asm,v 1.24 2004/09/12 04:46:27 perditionc Exp $;%ifdef WATCOM%ifdef _INIT%define WATCOM_INIT ; no seperate init segment for watcom.%endif%endif%ifndef WATCOM_INIT %include "segs.inc"%ifdef _INIT segment INIT_TEXT %define FMEMCPYBACK INIT_FMEMCPYBACK %define MEMCPY INIT_MEMCPY %define FMEMCPY INIT_FMEMCPY %define MEMSET INIT_MEMSET %define FMEMSET INIT_FMEMSET %define STRCPY INIT_STRCPY %define FSTRCPY INIT_FSTRCPY %define STRLEN INIT_STRLEN %define FSTRLEN INIT_FSTRLEN %define FMEMCHR INIT_FMEMCHR %define FSTRCHR INIT_FSTRCHR %define STRCHR INIT_STRCHR %define FSTRCMP INIT_FSTRCMP %define STRCMP INIT_STRCMP %define FSTRNCMP INIT_FSTRNCMP %define STRNCMP INIT_STRNCMP %define FMEMCMP INIT_FMEMCMP %define MEMCMP INIT_MEMCMP%else segment HMA_TEXT%endif;*********************************************************************; this implements some of the common string handling functions;; every function has 1 entry;; NEAR FUNC();; currently done:;; fmemcpyBack(void FAR *dest, void FAR *src, int count); memcpy(void *dest, void *src, int count); fmemcpy(void FAR *dest, void FAR *src, int count); memset(void *dest, int ch, int count);; fmemset(void FAR *dest, int ch, int count);; strcpy (void *dest, void *src);; fstrcpy (void FAR*dest, void FAR *src);; strlen (void *dest);; fstrlen (void FAR*dest);; fmemchr (BYTE FAR *src , int ch);; fstrchr (BYTE FAR *src , int ch);; strchr (BYTE *src , int ch);; fstrcmp (BYTE FAR *s1 , BYTE FAR *s2);; strcmp (BYTE *s1 , BYTE *s2);; fstrncmp(BYTE FAR *s1 , BYTE FAR *s2, int count);; strncmp(BYTE *s1 , BYTE *s2, int count);; fmemcmp(BYTE FAR *s1 , BYTE FAR *s2, int count);; memcmp(BYTE *s1 , BYTE *s2, int count);;***********************************************; pascal_setup - set up the standard calling frame for C-functions; and save registers needed later; also preload the args for the near functions; di=arg1; si=arg2; cx=arg3;pascal_setup: pop ax ; get return address push bp ; Standard C entry mov bp,sp%ifdef WATCOM push bx push cx push es%endif push si push di push ds ; Set both ds and es to same segment (for near copy) push ds pop es ; Set direction to autoincrement cld mov bl,6 ; majority (4) wants that mov cx,[4+bp] ; majority (8) wants that (near and far) mov si,[6+bp] ; majority (3) wants that (near) mov di,[8+bp] ; majority (3) wants that (near) jmp ax ;***********************************************;; VOID memcpy(REG BYTE *s, REG BYTE *d, REG COUNT n);; global MEMCPYMEMCPY: call pascal_setup ;mov cx,[4+bp] - preset above ;mov si,[6+bp] - preset above ;mov di,[8+bp] - preset above ;mov bl,6 - preset abovedomemcpy: ; And do the built-in byte copy, but do a 16-bit transfer ; whenever possible. shr cx,1 rep movsw jnc memcpy_return movsbmemcpy_return:%if 0 ; only needed for fmemcpyback cld%endif ;; pascal_return - pop saved registers and do return; jmp short pascal_return;************************************************************;; VOID fmemcpy(REG BYTE FAR *d, REG BYTE FAR *s,REG COUNT n);; VOID fmemcpyBack(REG BYTE FAR *d, REG BYTE FAR *s,REG COUNT n);; global FMEMCPY%if 0 global FMEMCPYBACKFMEMCPYBACK: std ; force to copy the string in reverse order%endifFMEMCPY: call pascal_setup ; Get the repetition count, n preset above ; mov cx,[bp+4] ; Get the far source pointer, s lds si,[bp+6] ; Get the far destination pointer d les di,[bp+10] mov bl,10 jmp short domemcpy;***************************************************************;; VOID fmemset(REG VOID FAR *d, REG BYTE ch, REG COUNT n);; global FMEMSETFMEMSET: call pascal_setup ; Get the repetition count, n - preset above ; mov cx,[bp+4] ; Get the fill byte ch mov ax,[bp+6] ; Get the far source pointer, s les di,[bp+8] mov bl,8domemset: mov ah, al shr cx,1 rep stosw jnc pascal_return stosb jmp short pascal_return;***************************************************************;; VOID memset(REG VOID *d, REG BYTE ch, REG COUNT n);; global MEMSETMEMSET: call pascal_setup ; Get the repitition count, n - preset above ; mov cx,[bp+4] ; Get the char ch mov ax, [bp+6] ; Get the far source pointer, d - preset above ; mov di,[bp+8] ;mov bl, 6 ; preset above jmp short domemset;*****pascal_return: lds di, [bp] ; return address in ds, saved bp in di mov bh, 0 add bp, bx ; point bp to "as if there were 0 args" mov [bp+2], ds ; put return address at first arg mov [bp], di ; saved bp below that one pop ds pop di pop si%ifdef WATCOM pop es pop cx pop bx%endif mov sp,bp pop bp ret;***************************************************************** ; fstrcpy (void FAR*dest, void FAR *src);%ifndef _INIT global FSTRCPYFSTRCPY: call pascal_setup ; Get the source pointer, ss lds si,[bp+4] ; and the destination pointer, d les di,[bp+8] mov bl,8 jmp short dostrcpy%endif;****** global STRCPYSTRCPY: call pascal_setup ; Get the source pointer, ss mov si,[bp+4] ; and the destination pointer, d mov di,[bp+6] mov bl,4dostrcpy:strcpy_loop: lodsb stosb test al,al jne strcpy_loop jmp short pascal_return;****************************************************************** %ifndef _INIT global FSTRLENFSTRLEN: call pascal_setup ; Get the source pointer, ss les di,[bp+4] mov bl,4 jmp short dostrlen%endif;********************************************** global STRLENSTRLEN: call pascal_setup ; Get the source pointer, ss mov di,[bp+4] mov bl,2dostrlen: mov al,0 mov cx,0xffff repne scasb mov ax,cx not ax dec ax jmp short pascal_return;************************************************************; strchr (BYTE *src , int ch); global STRCHRSTRCHR: call pascal_setup ; Get the source pointer, ss ; mov cx,[bp+4] - preset above ; mov si,[bp+6] - preset above mov bl,4strchr_loop: lodsb cmp al,cl je strchr_found test al,al jne strchr_loop strchr_retzero: xor ax, ax ; return NULL if not found mov dx, ax ; for fstrchr() jmp short pascal_return strchr_found: mov ax, si mov dx, ds ; for fstrchr()strchr_found1: dec ax jmp short pascal_return%ifndef _INIT;*****; fstrchr (BYTE far *src , int ch); global FSTRCHRFSTRCHR: call pascal_setup ; Get ch (preset above) ;mov cx, [bp+4] ;and the source pointer, src lds si, [bp+6] ;mov bl, 6 - preset above jmp short strchr_loop;****** global FMEMCHRFMEMCHR: call pascal_setup ; Get the length - preset above ; mov cx, [bp+4] ; and the search value mov ax, [bp+6] ; and the source pointer, ss les di, [bp+8] mov bl, 8 jcxz strchr_retzero repne scasb jne strchr_retzero mov dx, es mov ax, di jmp short strchr_found1;********************************************************************** global FSTRCMPFSTRCMP: call pascal_setup ; Get the source pointer, ss lds si,[bp+4] ; and the destination pointer, d les di,[bp+8] jmp short dostrcmp;****** global _strcmp_strcmp: call pascal_setup ; Get the source pointer, ss ; mov si,[bp+4] ; and the destination pointer, d ; mov di,[bp+6] xchg si,didostrcmp: ; replace strncmp(s1,s2)--> ; strncmp(s1,s2,0xffff) mov cx,0xffff jmp short dostrncmp ;********************************************************************** global FSTRNCMPFSTRNCMP: call pascal_setup ; Get the source pointer, ss lds si,[bp+4] ; and the destination pointer, d les di,[bp+8] mov cx,[bp+12] jmp short dostrncmp;****** global _strncmp_strncmp: call pascal_setup ; Get the source pointer, ss ;mov si,[bp+4] ; and the destination pointer, d ;mov di,[bp+6] ;mov cx,[bp+8] xchg si,didostrncmp: jcxz strncmp_retzerostrncmp_loop: lodsb scasb jne strncmp_done test al,al loopne strncmp_loop jmp short strncmp_retzero %endif;**********************************************************************; fmemcmp(BYTE FAR *s1 , BYTE FAR *s2, int count); global FMEMCMPFMEMCMP: call pascal_setup ; the length - preset above ; mov cx, [bp+4] ; Get the source pointer, ss les di,[bp+6] ; and the destination pointer, d lds si,[bp+10] mov bl,10 jmp short domemcmp;******; memcmp(BYTE *s1 , BYTE *s2, int count); global MEMCMPMEMCMP: call pascal_setup ; all preset: Get the source pointer, ss ;mov si,[bp+6] ; and the destination pointer, d ;mov di,[bp+8] ;mov cx,[bp+4] ;mov bl,6 xchg si,didomemcmp: jcxz strncmp_retzero repe cmpsb jne strncmp_donestrncmp_retzero: xor ax, ax jmp short strncmp_done2strncmp_done: lahf ror ah,1strncmp_done2: jmp pascal_return%endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -