|
|
1.1 root 1: //////////
2: / i8086 C string library internals.
3: / _memxchg()
4: / Exchange records of Count bytes pointed to by S1 and S2.
5: //////////
6:
7: //////////
8: / void _memxchg(char *S1, char *S2, size_t Count)
9: //////////
10:
11: #include <larges.h>
12:
13: S1 = LEFTARG
14: S2 = S1+DPL
15: Count = S2+DPL
16:
17: Enter(_memxchg_)
18: mov cx, Count(bp) / Count to CX
19: jcxz 2f / Done if Count is 0
20:
21: Lds si, S2(bp) / S2 address to DS:SI
22: Les di, S1(bp) / S1 address to ES:DI
23: cld
24: shr cx, $1 / Convert byte count to word count
25: jnc 1f / Count even, skip byte exchange
26:
27: movb al, Pes (di) / S1 byte to AL
28: movsb / S2 byte to S1, bump DI and SI
29: movb -1(si), al / S1 byte to old S2
30: jz 2f / Done if Count is 0
31:
32: 1:
33: mov ax, Pes (di) / S1 word to AX
34: movs / S2 word to S1, bump DI and SI
35: mov -2(si), ax / S1 word to old S2
36: loop 1b / Decrement byte count and repeat
37:
38: 2:
39: Leave
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.