codei86.asm

来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 1,210 行 · 第 1/3 页

ASM
1,210
字号
        pop     di                      ; restore destination address
        pop     ds                      ; restore ds
endb    ZP_strcpy

defsb   DF_strcpy
        db      "/* es:di strcpy( es:di, ds:si ) zaps ax,si */",0
        db      "#define DF_strcpy_ret   HW_D_2( HW_ES, HW_DI )",0
        db      "#define DF_strcpy_parms P_ESDI_DSSI",0
        db      "#define DF_strcpy_saves HW_NotD_2( HW_AX, HW_SI )",0
        db      0
;
;       ES:DI strcpy( ES:DI, DS:SI )
;       AX and SI are modified
;
beginb  DF_strcpy
        push    di                      ; save destination address
        _loop                           ; loop
          mov   al,[si]                 ; - get char from src
          mov   es:[di],al              ; - store in output buffer
          cmp   al,0                    ; - quit if end of string
          _quif e                       ; - ...
          mov   al,1[si]                ; - get next char
          add   si,2                    ; - bump up pointer
          mov   es:1[di],al             ; - copy it
          add   di,2                    ; - bump up pointer
          cmp   al,0                    ; - check for end of string
        _until  e                       ; until end of string
        pop     di                      ; restore destination address
endb    DF_strcpy

defsb   DP_strcpy
        db      "/* es:di strcpy( es:di, si:ax ) zaps ax,si */",0
        db      "#define DP_strcpy_ret   HW_D_2( HW_ES, HW_DI )",0
        db      "#define DP_strcpy_parms P_ESDI_SIAX",0
        db      "#define DP_strcpy_saves HW_NotD_2( HW_AX, HW_SI )",0
        db      0
;
;       ES:DI _fstrcpy( ES:DI, SI:AX )
;       AX and SI are modified
;
beginb  DP_strcpy
        push    ds                      ; save ds
        push    di                      ; save destination address
        xchg    si,ax                   ; get offset into si, segment into ax
        mov     ds,ax                   ; load segment
        _loop                           ; loop
          mov   al,[si]                 ; - get char from src
          mov   es:[di],al              ; - store in output buffer
          cmp   al,0                    ; - quit if end of string
          _quif e                       ; - ...
          mov   al,1[si]                ; - get next char
          add   si,2                    ; - bump up pointer
          mov   es:1[di],al             ; - copy it
          add   di,2                    ; - bump up pointer
          cmp   al,0                    ; - check for end of string
        _until  e                       ; until end of string
        pop     di                      ; restore destination address
        pop     ds                      ; restore ds
endb    DP_strcpy

;=======================================================================

defsb   S_memset
        db      "/* di memset( di, al, cx ) zaps es,cx */",0
        db      "#define S_memset_ret   HW_D( HW_DI )",0
        db      "#define S_memset_parms P_DI_AL_CX",0
        db      "#define S_memset_saves HW_NotD_2( HW_ES, HW_CX )",0
        db      0

beginb  S_memset
        push    di                      ; save destination address
        push    ds                      ; set ES=DS
        pop     es                      ; ...
        rep     stosb                   ; do repeat store
        pop     di                      ; restore destination address
endb    S_memset


defsb   C_memset
        db      "/* di memset( di, al, cx ) zaps es,ah,cx */",0
        db      "#define C_memset_ret   HW_D( HW_DI )",0
        db      "#define C_memset_parms P_DI_AL_CX",0
        db      "#define C_memset_saves HW_NotD_3( HW_ES, HW_AH, HW_CX )",0
        db      0

beginb  C_memset
        push    di                      ; save destination address
        push    ds                      ; set ES=DS
        pop     es                      ; ...
        mov     ah,al                   ; duplicate byte to store in high byte
        shr     cx,1                    ; calc. number of words to store
        rep     stosw                   ; store words
        adc     cx,cx                   ; see if 1 more byte to do
        rep     stosb                   ; do repeat store
        pop     di                      ; restore destination address
endb    C_memset


defsb   ZF_memset
        db      "/* es:di memset( es:di, al, cx ) zaps cx */",0
        db      "#define ZF_memset_ret   HW_D_2( HW_ES, HW_DI )",0
        db      "#define ZF_memset_parms  P_ESDI_AL_CX",0
        db      "#define ZF_memset_saves  HW_NotD( HW_CX )",0
        db      0

beginb  ZF_memset
        push    di                      ; save destination address
        rep     stosb                   ; do repeat store
        pop     di                      ; restore destination address
endb    ZF_memset


defsb   ZP_memset
        db      "/* es:di memset( es:di, al, cx ) zaps cx */",0
        db      "#define ZP_memset_ret   HW_D_2( HW_ES, HW_DI )",0
        db      "#define ZP_memset_parms P_ESDI_AL_CX",0
        db      "#define ZP_memset_saves HW_NotD( HW_CX )",0
        db      0

beginb  ZP_memset
        push    di                      ; save destination address
        rep     stosb                   ; do repeat store
        pop     di                      ; restore destination address
endb    ZP_memset


defsb   DF_memset
        db      "/* es:di memset( es:di, al, cx ) zaps ah,cx */",0
        db      "#define DF_memset_ret  HW_D_2( HW_ES, HW_DI )",0
        db      "#define DF_memset_parms P_ESDI_AL_CX",0
        db      "#define DF_memset_saves  HW_NotD_2( HW_AH, HW_CX )",0
        db      0

beginb  DF_memset
        push    di                      ; save destination address
        mov     ah,al                   ; duplicate byte to store in high byte
        shr     cx,1                    ; calc. number of words to store
        rep     stosw                   ; store words
        adc     cx,cx                   ; see if 1 more byte to do
        rep     stosb                   ; do repeat store
        pop     di                      ; restore destination address
endb    DF_memset


defsb   DP_memset
        db      "/* es:di memset( es:di, al, cx ) zaps ah,cx */",0
        db      "#define DP_memset_ret   HW_D_2( HW_ES, HW_DI )",0
        db      "#define DP_memset_parms P_ESDI_AL_CX",0
        db      "#define DP_memset_saves HW_NotD_2( HW_AH, HW_CX )",0
        db      0

beginb  DP_memset
        push    di                      ; save destination address
        mov     ah,al                   ; duplicate byte to store in high byte
        shr     cx,1                    ; calc. number of words to store
        rep     stosw                   ; store words
        adc     cx,cx                   ; see if 1 more byte to do
        rep     stosb                   ; do repeat store
        pop     di                      ; restore destination address
endb    DP_memset
;=======================================================================

defsb   S_memcpy
        db      "/* di memcpy( di, si, cx ) zaps es,si,cx */",0
        db      "#define S_memcpy_ret   HW_D( HW_DI )",0
        db      "#define S_memcpy_parms P_DI_SI_CX",0
        db      "#define S_memcpy_saves  HW_NotD_3( HW_ES, HW_SI, HW_CX )",0
        db      0

beginb  S_memcpy
        push    di                      ; save destination address
        push    ds                      ; set ES=DS
        pop     es                      ; ...
        rep     movsb                   ; do repeat move
        pop     di                      ; restore destination address
endb    S_memcpy


defsb   C_memcpy
        db      "/* di memcpy( di, si, cx ) zaps ax,es,si,cx */",0
        db      "#define C_memcpy_ret   HW_D( HW_DI )",0
        db      "#define C_memcpy_parms P_DI_SI_CX",0
        db      "#define C_memcpy_saves  HW_NotD_4( HW_AX, HW_ES, HW_SI, HW_CX )",0
        db      0

beginb  C_memcpy
        push    di                      ; save destination address
        mov     ax,ds                   ; set ES=DS
        mov     es,ax                   ; ...
        shr     cx,1                    ; calc. number of words to move
        rep     movsw                   ; move words
        adc     cx,cx                   ; see if 1 more byte to do
        rep     movsb                   ; do repeat move
        pop     di                      ; restore destination address
endb    C_memcpy


defsb   ZF_memcpy
        db      "/* es:di memcpy( es:di, ds:si, cx ) zaps cx,si */",0
        db      "#define ZF_memcpy_ret   HW_D_2( HW_ES, HW_DI )",0
        db      "#define ZF_memcpy_parms  P_ESDI_DSSI_CX",0
        db      "#define ZF_memcpy_saves   HW_NotD_2( HW_SI, HW_CX )",0
        db      0

beginb  ZF_memcpy
        push    di                      ; save destination address
        rep     movsb                   ; do repeat move
        pop     di                      ; restore destination address
endb    ZF_memcpy


defsb   ZP_memcpy
        db      "/* es:di memcpy( es:di, cx:si, ax ) zaps cx,si,ax */",0
        db      "#define ZP_memcpy_ret   HW_D_2( HW_ES, HW_DI )",0
        db      "#define ZP_memcpy_parms  P_ESDI_CXSI_AX",0
        db      "#define ZP_memcpy_saves  HW_NotD_3( HW_SI, HW_CX, HW_AX )",0
        db      0

beginb  ZP_memcpy
        push    ds                      ; save DS
        push    di                      ; save destination address
        xchg    cx,ax                   ; move count to CX, segment to AX
        mov     ds,ax                   ; load segment
        rep     movsb                   ; do repeat move
        pop     di                      ; restore destination address
        pop     ds                      ; restore DS
endb    ZP_memcpy


defsb   DF_memcpy
        db      "/* es:di memcpy( es:di, ds:si, cx ) zaps cx,si */",0
        db      "#define DF_memcpy_ret  HW_D_2( HW_ES, HW_DI )",0
        db      "#define DF_memcpy_parms P_ESDI_DSSI_CX",0
        db      "#define DF_memcpy_saves  HW_NotD_2( HW_SI, HW_CX )",0
        db      0

beginb  DF_memcpy
        push    di                      ; save destination address
        shr     cx,1                    ; calc. number of words to move
        rep     movsw                   ; move words
        adc     cx,cx                   ; see if 1 more byte to do
        rep     movsb                   ; do repeat move
        pop     di                      ; restore destination address
endb    DF_memcpy


defsb   DP_memcpy
        db      "/* es:di memcpy( es:di, cx:si, ax ) zaps cx,si,ax */",0
        db      "#define DP_memcpy_ret  HW_D_2( HW_ES, HW_DI )",0
        db      "#define DP_memcpy_parms P_ESDI_CXSI_AX",0
        db      "#define DP_memcpy_saves HW_NotD_3( HW_SI, HW_CX, HW_AX )",0
        db      0

beginb  DP_memcpy
        push    ds                      ; save DS
        push    di                      ; save destination address
        xchg    cx,ax                   ; move count to CX, segment to AX
        mov     ds,ax                   ; load segment
        shr     cx,1                    ; calc. number of words to move
        rep     movsw                   ; move words
        adc     cx,cx                   ; see if 1 more byte to do
        rep     movsb                   ; do repeat move
        pop     di                      ; restore destination address
        pop     ds                      ; restore DS
endb    DP_memcpy

;=======================================================================


defsb   C_div
        db      "/* dx:ax  div( ax, cx ) */",0
        db      "#define C_div_ret       HW_D_2( HW_AX, HW_DX )",0
        db      "#define C_div_parms     P_AX_CX",0
        db      "#define C_div_saves     HW_NotD_2( HW_AX, HW_DX )",0
        db      0
beginb  C_div
        CWD
        IDIV    CX
endb    C_div

defsb   DF_stosw
        db      "/* es:di stosw( es:di, ds:si, cx ) zaps si,cx */",0
        db      "#define DF_stosw_ret   HW_D( HW_DI )",0
        db      "#define DF_stosw_parms P_ESDI_AX_CX",0
        db      "#define DF_stosw_saves HW_NotD_2( HW_DI, HW_CX )",0
        db      0
beginb  DF_stosw
        REP     STOSW
endb    DF_stosw

defsb   DF_stoswb
        db      "/* es:di stoswb( es:di, ds:si, cx ) zaps si,cx */",0
        db      "#define DF_stoswb_ret   HW_D( HW_DI )",0
        db      "#define DF_stoswb_parms P_ESDI_AX_CX",0
        db      "#define DF_stoswb_saves HW_NotD_2( HW_DI, HW_CX )",0
        db      0
beginb  DF_stoswb
        REP     STOSW
        STOSB
endb    DF_stoswb

defsb   C_memcmp
        db      "/* ax memcmp( si, di, cx ) zaps ax,es,si,di,cx */",0
        db      "#define C_memcmp_ret    HW_D( HW_AX )",0
        db      "#define C_memcmp_parms  P_SI_DI_CX",0
        db      "#define C_memcmp_saves  HW_NotD_5( HW_AX, HW_ES, HW_SI, HW_DI, HW_CX )",0
        db      0
beginb  C_memcmp
        MOV     AX,DS
        MOV     ES,AX
        XOR     AX,AX
        REPZ    CMPSB
        JZ      E_C_memcmp
        SBB     AX,AX
        SBB     AX,-1
endb    C_memcmp

defsb   DF_memcmp
        db      "/* cx memcmp( ds:si, es:di, cx ) zaps si,di,cx */",0
        db      "#define DF_memcmp_ret   HW_D( HW_CX )",0
        db      "#define DF_memcmp_parms P_DSSI_ESDI_CX",0
        db      "#define DF_memcmp_saves HW_NotD_3( HW_SI, HW_DI, HW_CX )",0
        db      0
beginb  DF_memcmp
        OR      CX,CX
        REPZ    CMPSB
        JZ      E_DF_memcmp
        SBB     CX,CX
        SBB     CX,-1
endb    DF_memcmp

defsb   DP_memcmp
        db      "/* cx memcmp( cx:si, es:di, ax ) zaps si,di,cx,ax */",0
        db      "#define DP_memcmp_ret   HW_D( HW_CX )",0
        db      "#define DP_memcmp_parms P_CXSI_ESDI_AX",0
        db      "#define DP_memcmp_saves HW_NotD_4( HW_SI, HW_DI, HW_CX, HW_AX )",0
        db      0
beginb  DP_memcmp
        PUSH    DS
        XCHG    AX,CX
        MOV     DS,AX
        OR      CX,CX
        REPZ    CMPSB
        JZ      E_DP_memcmp1
        SBB     CX,CX
        SBB     CX,-1
E_DP_memcmp1:
        POP     DS
endb    DP_memcmp

defsb   C_memchr
        db      "/* di memchr( di, al, cx ) zaps dx,es,di,cx */",0
        db      "#define C_memchr_ret    HW_D( HW_DI )",0
        db      "#define C_memchr_parms  P_DI_AL_CX",0
        db      "#define C_memchr_saves  HW_NotD_4( HW_DX, HW_ES, HW_DI, HW_CX )",0
        db      0
beginb  C_memchr
        JCXZ    E_C_memchr1
        MOV     DX,DS
        MOV     ES,DX
        REPNZ   SCASB
        JNZ     E_C_memchr1
        DEC     DI
        DB      0A9h
E_C_memchr1:
        MOV     DI,CX
endb    C_memchr

defsb   DF_memchr
        db      "/* cx:di memchr( es:di, al, cx ) zaps di,cx */",0
        db      "#define DF_memchr_ret   HW_D_2( HW_DI, HW_CX )",0
        db      "#define DF_memchr_parms P_ESDI_AL_CX",0
        db      "#define DF_memchr_saves HW_NotD_2( HW_DI, HW_CX )",0
        db      0
beginb  DF_memchr
        JCXZ    E_DF_memchr1
        REPNZ   SCASB
        JNZ     E_DF_memchr1
        DEC     DI
        MOV     CX,ES
        DB      0A9h
E_DF_memchr1:
        MOV     DI,CX
endb    DF_memchr

defsb   DP_memchr
        db      "/* cx:di memchr( es:di, al, cx ) zaps di,cx */",0
        db      "#define DP_memchr_ret   HW_D_2( HW_DI, HW_CX )",0
        db      "#define DP_memchr_parms P_ESDI_AL_CX",0
        db      "#define DP_memchr_saves HW_NotD_2( HW_DI, HW_CX )",0
        db      0
beginb  DP_memchr
        JCXZ    E_DP_memchr1
        REPNZ   SCASB
        JNZ     E_DP_memchr1
        DEC     DI
        MOV     CX,ES
        DB      0A9h
E_DP_memchr1:
        MOV     DI,CX
endb    DP_memchr

defsb   S_strcmp
        db      "/* ax strcmp( si, di ) zaps ax,si,di */",0

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?