mu/linux/303kernel-string.subx

92 lines
2.2 KiB
Plaintext

# We can't really do much with null-terminated kernel strings, and we don't
# want to. Let's turn them into regular length-prefixed strings at the first
# opportunity.
== code
kernel-string-to-string: # ad: (addr allocation-descriptor), in: (addr kernel-string), out: (addr handle array byte)
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
# . save registers
51/push-ecx
52/push-edx
53/push-ebx
56/push-esi
57/push-edi
# var len/ecx: int = length(in)
(kernel-string-length *(ebp+0xc))
89/<- %ecx 0/r32/eax
# result = allocate-array(ad, len)
(allocate-array *(ebp+8) %ecx *(ebp+0x10))
# var c/edx: byte = 0
ba/copy-to-edx 0/imm32
# var src/esi: (addr byte) = in
8b/-> *(ebp+0xc) 6/r32/esi
# var dest/edi: (addr byte) = result->data
8b/-> *(ebp+0x10) 7/r32/edi
(lookup *edi *(edi+4)) # => eax
8d/copy-address *(eax+4) 7/r32/edi
{
$kernel-string-to-string:loop:
# c = *src
8a/byte-> *esi 2/r32/dl
# if (c == 0) break
81 7/subop/compare %edx 0/imm32
74/jump-if-= break/disp8
# *dest = c
88/byte<- *edi 2/r32/dl
# ++src
46/increment-esi
# ++dest
47/increment-edi
eb/jump loop/disp8
}
$kernel-string-to-string:end:
# . restore registers
5f/pop-to-edi
5e/pop-to-esi
5b/pop-to-ebx
5a/pop-to-edx
59/pop-to-ecx
# . epilogue
89/<- %esp 5/r32/ebp
5d/pop-to-ebp
c3/return
kernel-string-length: # in: (addr kernel-string) -> result/eax: int
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
# . save registers
51/push-ecx
52/push-edx
# result = 0
b8/copy-to-eax 0/imm32
# var c/ecx: byte = 0
b9/copy-to-ecx 0/imm32
# var curr/edx: (addr byte) = in
8b/-> *(ebp+8) 2/r32/edx
{
$kernel-string-length:loop:
# c = *curr
8a/byte-> *edx 1/r32/ecx
# if (c == 0) break
81 7/subop/compare %ecx 0/imm32
74/jump-if-= break/disp8
# ++curr
42/increment-edx
# ++result
40/increment-eax
#
eb/jump loop/disp8
}
$kernel-string-length:end:
# . restore registers
5a/pop-to-edx
59/pop-to-ecx
# . epilogue
89/<- %esp 5/r32/ebp
5d/pop-to-ebp
c3/return