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