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 + -
显示快捷键?