|
|
1.1 root 1: / memory-move operations for the Coherent kernel. The functions called here
2: / do exactly the same thing as the regular C library version.
3:
4: .unixorder
5:
6: .globl memset
7:
8: dest = 4
9: ch = 8
10: len = 12
11:
12: memset:
13: movzxb ch(%esp), %eax / Fill pattern to %eax
14: movl $0x01010101, %ecx / Replicate fill byte into
15: mull %ecx, %eax / all of %eax (4 copies)
16: / (overwrites %edx too)
17:
18: movl %edi, %edx / Save %edi
19: movl dest(%esp), %edi / Get dest to %edi
20:
21: movl len(%esp), %ecx / Get length
22: shrl $2, %ecx / in longwords
23:
24: cld / Fill upwards
25: rep stosl / Perform the fill
26:
27: jnc ?noword / Skip over residual word copy
28:
29: stosw
30: ?noword:
31: testb $1, len(%esp) / Check low part of count
32: je ?nobyte / Skip over residual byte copy
33:
34: stosb
35: ?nobyte:
36: movl %edx, %edi / Restore %edi
37: movl dest(%esp), %eax / Return destination
38: ret
39:
40:
41: .globl memcpy
42:
43: dest = 4
44: src = 8
45: len = 12
46:
47: memcpy:
48: movl %esi, %eax / Save %esi
49: movl src(%esp), %esi / Get src
50:
51: movl %edi, %edx / Save %edi
52: movl dest(%esp), %edi / Get dest
53:
54: movl len(%esp), %ecx / Get length
55: shrl $2, %ecx / in longwords
56:
57: cld / Copy upwards
58: rep movsl / in longwords
59:
60: jnc ?noword / Skip residual word copy
61:
62: movsw
63: ?noword:
64: testb $1, len(%esp) / Check low byte of length
65: je ?nobyte / Skip residual byte copy
66:
67: movsb
68: ?nobyte:
69: movl %edx, %edi / Restore %edi
70: movl %eax, %esi / Restore %esi
71: movl dest(%esp), %eax / Return destination
72: ret
73:
74: / String comparison with length limit.
75:
76: .globl strncmp
77:
78: left = 4
79: right = 8
80: len = 12
81:
82: strncmp:
83: movl len(%esp), %ecx / Maximum length
84: jecxz ?strncmp_empty
85:
86: movl %esi, %edx / Preserve %esi
87: movl left(%esp), %esi / Get left
88:
89: pushl %edi / Preserve %edi
90: movl right+4(%esp), %edi / Get right, adjusting the
91: / stack offset for push
92:
93: cld / Scan upwards
94: xorl %eax, %eax / Zero top bytes in %eax
95:
96: ?strncmp_loop: lodsb / %al = * %ds:%esi ++
97: scasb / * %es:%edi ++ - %al ?
98: jne ?strncmp_noteq
99: orb %al, %al / %al == 0 ?
100: loopne ?strncmp_loop
101:
102: / Either %al == 0 or %ecx == 0, and we have a match. Zero %eax
103: xorl %eax, %eax
104: popl %edi / Restore %edi
105: movl %edx, %esi / Restore %esi
106: ret
107:
108: ?strncmp_noteq:
109: movb $1, %al
110: ja ?strncmp_less / Branch if %al was > * right
111: / hence return %eax == 1
112: negl %eax / Here if %al < * right,
113: / hence return %eax == -1
114: ?strncmp_less:
115: popl %edi / Restore %edi
116: movl %edx, %esi / Restore %esi
117: ret
118:
119: ?strncmp_empty: xorl %eax, %eax / Count == 0 => left == right
120: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.