code386.asm

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

ASM
1,442
字号
        db      "/* edi strcpy( edi, esi ) zaps eax,esi */",0
        db      "#define S_strcpy_ret   HW_D( HW_EDI )",0
        db      "#define S_strcpy_parms P_EDI_ESI",0
        db      "#define S_strcpy_saves HW_NotD_2( HW_EAX, HW_ESI )",0
        db      0
;
;       EDI strcpy( EDI, ESI )
;       EAX and ESI are modified
;
beginb  S_strcpy
        push    edi                     ; save destination address
        _loop                           ; loop
          lodsb                         ; - get char from src
          mov   [edi],al                ; - store in output buffer
          inc   edi                     ; - increment pointer
          cmp   al,0                    ; - check for end of string
        _until  e                       ; until end of string
        pop     edi                     ; restore destination address
endb    S_strcpy

defsb   Z_strcpy
        db      "/* es:edi strcpy( es:edi, ds:esi ) zaps eax,esi */",0
        db      "#define Z_strcpy_ret   HW_D_2( HW_ES, HW_EDI )",0
        db      "#define Z_strcpy_parms P_ESEDI_DSESI",0
        db      "#define Z_strcpy_saves HW_NotD_2( HW_EAX, HW_ESI )",0
        db      0
;
;       ES:EDI strcpy( ES:EDI, DS:ESI )
;       EAX and ESI are modified
;
beginb  Z_strcpy
        push    edi                     ; save destination address
        _loop                           ; loop
          lodsb                         ; - get char from src
          stosb                         ; - store in output buffer
          cmp   al,0                    ; - check for end of string
        _until  e                       ; until end of string
        pop     edi                     ; restore destination address
endb    Z_strcpy

defsb   BD_strcpy
        db      "/* es:edi strcpy( es:edi, ds:esi ) zaps eax,esi */",0
        db      "#define BD_strcpy_ret   HW_D_2( HW_ES, HW_EDI )",0
        db      "#define BD_strcpy_parms P_ESEDI_DSESI",0
        db      "#define BD_strcpy_saves HW_NotD_2( HW_EAX, HW_ESI )",0
        db      0
;
;       ES:EDI strcpy( ES:EDI, DS:ESI )
;       EAX and ESI are modified
;
beginb  BD_strcpy
        push    edi                     ; save destination address
        _loop                           ; loop
          mov   al,[esi]                ; - get char from src
          mov   es:[edi],al             ; - store in output buffer
          cmp   al,0                    ; - quit if end of string
          je    short E_BD_strcpy1      ; - ...
          mov   al,1[esi]               ; - get next char
          add   esi,2                   ; - bump up pointer
          mov   es:1[edi],al            ; - copy it
          add   edi,2                   ; - bump up pointer
          cmp   al,0                    ; - check for end of string
        _until  e                       ; until end of string
E_BD_strcpy1:
        pop     edi                     ; restore destination address
endb    BD_strcpy

defsb   DP_strcpy
        db      "/* dx:eax strcpy( dx:eax, cx:ebx ) zaps esi,edi */",0
        db      "#define DP_strcpy_ret   HW_D_2( HW_DX, HW_EAX )",0
        db      "#define DP_strcpy_parms P_DXEAX_CXEBX",0
        db      "#define DP_strcpy_saves HW_NotD_2( HW_ESI, HW_EDI )",0
        db      0
;
;       DX:EAX _fstrcpy( DX:EAX, CX:EBX )
;       EDI and ESI are modified
;
beginb  DP_strcpy
        push    ds                      ; save segment registers
        push    es                      ; ...
        push    eax                     ; save destination address
        mov     es,edx                  ; load segment registers
        mov     ds,ecx                  ; ...
        mov     esi,ebx                 ; get source offset
        mov     edi,eax                 ; get destination offset
        _loop                           ; loop
          mov   al,[esi]                ; - get char from src
          mov   es:[edi],al             ; - store in output buffer
          cmp   al,0                    ; - quit if end of string
          je    short E_DP_strcpy1      ; - ...
          mov   al,1[esi]               ; - get next char
          add   esi,2                   ; - bump up pointer
          mov   es:1[edi],al            ; - copy it
          add   edi,2                   ; - bump up pointer
          cmp   al,0                    ; - check for end of string
        _until  e                       ; until end of string
E_DP_strcpy1:
        pop     eax                     ; restore destination address
        pop     es                      ; restore segment registers
        pop     ds                      ; ...
endb    DP_strcpy


defsb   C_div
        db      "/* edx:eax  div( eax, ecx ) */",0
        db      "#define C_div_ret   HW_D( HW_EAX )",0
        db      "#define C_div_parms P_EAX_ECX",0
        db      "#define C_div_saves HW_NotD_2( HW_EAX, HW_EDX )",0
        db      0
beginb  C_div
        CDQ
        IDIV    ECX
        MOV     Dword Ptr [ESI],EAX
        MOV     Dword Ptr [ESI+4],EDX
endb    C_div

defsb   S_memset
        db      "/* edi memset( edi, al, ecx ) zaps es,ecx */",0
        db      "#define S_memset_ret   HW_D( HW_EDI )",0
        db      "#define S_memset_parms P_EDI_AL_ECX",0
        db      "#define S_memset_saves HW_NotD( HW_ECX )",0
        db      0
beginb  S_memset
        PUSH    ES
        PUSH    EDI
        PUSH    DS
        POP     ES
        REP     STOSB
        POP     EDI
        POP     ES
endb    S_memset

defsb   FS_memset
        db      "/* edi memset( edi, al, ecx ) zaps es,ecx */",0
        db      "#define FS_memset_ret    HW_D( HW_EDI )",0
        db      "#define FS_memset_parms  P_EDI_AL_ECX",0
        db      "#define FS_memset_saves  HW_NotD( HW_ECX )",0
        db      0
beginb  FS_memset
        PUSH    EDI
        REP     STOSB
        POP     EDI
endb    FS_memset

defsb   C_memset
        db      "/* edi memset( edi, al, ecx ) zaps es,ah,ecx */",0
        db      "#define C_memset_ret    HW_D( HW_EDI )",0
        db      "#define C_memset_parms  P_EDI_AL_ECX",0
        db      "#define C_memset_saves  HW_NotD_2( HW_AH, HW_ECX )",0
        db      0
beginb  C_memset
        PUSH    ES
        PUSH    DS
        POP     ES
        PUSH    EDI
        MOV     AH,AL
        SHR     ECX,1
        REP     STOSW
        ADC     ECX,ECX
        REP     STOSB
        POP     EDI
        POP     ES
endb    C_memset

defsb   FC_memset
        db      "/* edi memset( edi, al, ecx ) zaps es,ah,ecx */",0
        db      "#define FC_memset_ret    HW_D( HW_EDI )",0
        db      "#define FC_memset_parms  P_EDI_AL_ECX",0
        db      "#define FC_memset_saves  HW_NotD_2( HW_AH, HW_ECX )",0
        db      0
beginb  FC_memset
        PUSH    EDI
        MOV     AH,AL
        SHR     ECX,1
        REP     STOSW
        ADC     ECX,ECX
        REP     STOSB
        POP     EDI
endb    FC_memset

defsb   Z_memset
        db      "/* es:edi memset( es:edi, al, ecx ) zaps ecx */",0
        db      "#define Z_memset_ret    HW_D_2( HW_ES, HW_EDI )",0
        db      "#define Z_memset_parms  P_ESEDI_AL_ECX",0
        db      "#define Z_memset_saves  HW_NotD( HW_ECX )",0
        db      0
beginb  Z_memset
        PUSH    EDI
        REP     STOSB
        POP     EDI
endb    Z_memset

defsb   BD_memset
        db      "/* es:edi memset( es:edi, al, ecx ) zaps ah,ecx */",0
        db      "#define BD_memset_ret    HW_D_2( HW_ES, HW_EDI )",0
        db      "#define BD_memset_parms  P_ESEDI_AL_ECX",0
        db      "#define BD_memset_saves  HW_NotD_2( HW_AH, HW_ECX )",0
        db      0
beginb  BD_memset
        PUSH    EDI
        MOV     AH,AL
        SHR     ECX,1
        REP     STOSW
        ADC     ECX,ECX
        REP     STOSB
        POP     EDI
endb    BD_memset

defsb   DP_memset
        db      "/* dx:edi memset( dx:edi, al, ecx ) zaps ah,ecx */",0
        db      "#define DP_memset_ret    HW_D_2( HW_DX, HW_EDI )",0
        db      "#define DP_memset_parms  P_DXEDI_AL_ECX",0
        db      "#define DP_memset_saves  HW_NotD_2( HW_AH, HW_ECX )",0
        db      0
beginb  DP_memset
        PUSH    ES
        PUSH    EDI
        MOV     ES,EDX
        MOV     AH,AL
        SHR     ECX,1
        REP     STOSW
        ADC     ECX,ECX
        REP     STOSB
        POP     EDI
        POP     ES
endb    DP_memset

defsb   C_stosw
        db      "/* edi stosw( es:edi, ax, ecx ) zaps edi,ecx */",0
        db      "/* used when value of ECX is known to be even */",0
        db      "#define C_stosw_ret    HW_D( HW_EDI )",0
        db      "#define C_stosw_parms  P_DXEDI_AX_ECX",0
        db      "#define C_stosw_saves  HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  C_stosw
        PUSH    ES
        MOV     ES,EDX
        REP     STOSW
        POP     ES
endb    C_stosw

defsb   F_stosw
        db      "/* edi stosw( edi, ax, ecx ) zaps edi,ecx */",0
        db      "/* used when value of ECX is known to be even */",0
        db      "#define F_stosw_ret    HW_D( HW_EDI )",0
        db      "#define F_stosw_parms  P_EDI_AX_ECX",0
        db      "#define F_stosw_saves  HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  F_stosw
        REP     STOSW
endb    F_stosw

defsb   BD_stosw
        db      "/* es:edi stosw( es:edi, ax, ecx ) zaps edi,ecx */",0
        db      "#define BD_stosw_ret   HW_D( HW_EDI )",0
        db      "#define BD_stosw_parms P_ESEDI_AX_ECX",0
        db      "#define BD_stosw_saves HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  BD_stosw
        REP     STOSW
endb    BD_stosw

defsb   C_stosd
        db      "/* edi stosd( es:edi, eax, ecx ) zaps edi,ecx */",0
        db      "/* used when value of ECX is known to be multiple of 4 */",0
        db      "#define C_stosd_ret    HW_D( HW_EDI )",0
        db      "#define C_stosd_parms  P_DXEDI_EAX_ECX",0
        db      "#define C_stosd_saves  HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  C_stosd
        PUSH    ES
        MOV     ES,EDX
        REP     STOSD
        POP     ES
endb    C_stosd

defsb   F_stosd
        db      "/* edi stosd( edi, eax, ecx ) zaps edi,ecx */",0
        db      "/* used when value of ECX is known to be multiple of 4 */",0
        db      "#define F_stosd_ret    HW_D( HW_EDI )",0
        db      "#define F_stosd_parms  P_EDI_EAX_ECX",0
        db      "#define F_stosd_saves  HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  F_stosd
        REP     STOSD
endb    F_stosd

defsb   BD_stosd
        db      "/* es:edi stosd( es:edi, eax, ecx ) zaps edi,ecx */",0
        db      "#define BD_stosd_ret   HW_D( HW_EDI )",0
        db      "#define BD_stosd_parms P_ESEDI_EAX_ECX",0
        db      "#define BD_stosd_saves HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  BD_stosd
        REP     STOSD
endb    BD_stosd

defsb   C_stoswb
        db      "/* edi stoswb( es:edi, ax, ecx ) zaps edi,ecx */",0
        db      "/* used when value of ECX is known to be odd */",0
        db      "#define C_stoswb_ret    HW_D( HW_EDI )",0
        db      "#define C_stoswb_parms  P_DXEDI_AX_ECX",0
        db      "#define C_stoswb_saves  HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  C_stoswb
        PUSH    ES
        MOV     ES,EDX
        REP     STOSW
        STOSB
        POP     ES
endb    C_stoswb

defsb   F_stoswb
        db      "/* edi stoswb( edi, ax, ecx ) zaps edi,ecx */",0
        db      "/* used when value of ECX is known to be odd */",0
        db      "#define F_stoswb_ret    HW_D( HW_EDI )",0
        db      "#define F_stoswb_parms  P_EDI_AX_ECX",0
        db      "#define F_stoswb_saves  HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  F_stoswb
        REP     STOSW
        STOSB
endb    F_stoswb

defsb   BD_stoswb
        db      "/* es:edi stoswb( es:edi, ax, ecx ) zaps edi,ecx */",0
        db      "#define BD_stoswb_ret   HW_D( HW_EDI )",0
        db      "#define BD_stoswb_parms P_ESEDI_AX_ECX",0
        db      "#define BD_stoswb_saves HW_NotD_2( HW_EDI, HW_ECX )",0
        db      0
beginb  BD_stoswb
        REP     STOSW
        STOSB
endb    BD_stoswb

defsb   S_memcpy
        db      "/* edi memcpy( edi, esi, ecx ) zaps es,esi,ecx */",0
        db      "#define S_memcpy_ret    HW_D( HW_EDI )",0
        db      "#define S_memcpy_parms  P_EDI_ESI_ECX",0
        db      "#define S_memcpy_saves  HW_NotD_2( HW_ESI, HW_ECX )",0
        db      0
beginb  S_memcpy
        PUSH    ES
        PUSH    EDI
        PUSH    DS
        POP     ES
        REP     MOVSB
        POP     EDI
        POP     ES
endb    S_memcpy

defsb   FS_memcpy
        db      "/* edi memcpy( edi, esi, ecx ) zaps es,esi,ecx */",0
        db      "#define FS_memcpy_ret    HW_D( HW_EDI )",0
        db      "#define FS_memcpy_parms  P_EDI_ESI_ECX",0
        db      "#define FS_memcpy_saves  HW_NotD_2( HW_ESI, HW_ECX )",0
        db      0
beginb  FS_memcpy
        PUSH    EDI
        REP     MOVSB
        POP     EDI

⌨️ 快捷键说明

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