3fb900de ^
# 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
f47b4a640375af3c949b0347edadf12a8ff579'>a8f47b4a ^
|
|
" SubX syntax file
" Language: SubX
" Maintainer: Kartik Agaram <mu@akkartik.com>
" URL: https://github.com/akkartik/mu
" License: public domain
"
" Copy this file into your ftplugin directory, and add the following to your
" vimrc or to .vim/ftdetect/subx.vim:
" autocmd BufReadPost,BufNewFile *.subx set filetype=subx
"
" Some highlight groups you might want to select colors for in your vimrc:
" subxFunction
" subxMinorFunction
" subxTest
"
" Optionally, devote more colors to different kinds of comments. Some suggestions
" for 256-color terminals to add to your vimrc:
" blue tones:
" highlight subxH1Comment cterm=underline ctermfg=27
" highlight subxComment ctermfg=27
" highlight subxS1Comment ctermfg=19
" highlight subxS2Comment ctermfg=245
" blue-green tones
" highlight subxH1Comment cterm=underline ctermfg=25
" highlight subxComment ctermfg=25
" highlight subxS1Comment ctermfg=19
" highlight subxS2Comment ctermfg=245
" grey tones
" highlight subxH1Comment cterm=bold,underline
" highlight subxComment cterm=bold ctermfg=236
" highlight subxS1Comment cterm=bold ctermfg=242
" highlight subxS2Comment ctermfg=242
let s:save_cpo = &cpo
set cpo&vim
" setlocal iskeyword=@,48-57,?,!,_,$,-
setlocal formatoptions-=t " allow long lines
setlocal formatoptions+=c " but comments should still wrap
setlocal iskeyword+=-,?,<,>,$,@
syntax match subxH1Comment /# - .*/ | highlight link subxH1Comment Comment
syntax match subxComment /#\( \.\| - \|? \)\@!.*/ | highlight link subxComment Comment
syntax match subxS1Comment /# \..*/ | highlight link subxS1Comment Comment
syntax match subxS2Comment /# \. \..*/ | highlight link subxS2Comment Comment
set comments-=:#
set comments+=n:#
syntax match subxCommentedCode "#? .*" | highlight link subxCommentedCode CommentedCode | highlight link CommentedCode Comment
let b:cmt_head = "#? "
" comment token
syntax match subxDelimiter / \. / | highlight link subxDelimiter Normal
syntax match subxString %"[^"]*"% | highlight link subxString Constant
"" definitions
" match globals but not registers like 'EAX'
" don't match capitalized words in metadata
" don't match inside strings
syntax match subxGlobal %\(/\)\@<!\<[A-Z][a-z0-9_-]*\>% | highlight link subxGlobal SpecialChar
" functions but not tests, globals or internal functions
syntax match subxFunction "^\(test_\)\@<![a-z][^ ]*\(:\)\@=" | highlight link subxFunction Function
" tests starting with 'test-'; dark:34 light:64
syntax match subxTest "^test-[^ ]*\(:\)\@=" | highlight link subxTest Typedef
" internal functions starting with '_'
syntax match subxMinorFunction "^_[^ ]*\(:\)\@=" | highlight link subxMinorFunction Ignore
" other internal labels starting with '$'
syntax match subxLabel "^\$[^ ]*\(:\)\@=" | highlight link subxLabel Constant
syntax keyword subxControl break loop | highlight link subxControl Constant
let &cpo = s:save_cpo
|