;unsigned char *putVLQ(unsigned value, unsigned char *dest) // запиши ВПД ;{ // (вж. Standard MIDI-File Format Spec. 1.1) ; unsigned buffer = value & 0x7f; ; while ((value >>= 7) > 0) { ; buffer <<= 8; ; buffer |= 0x80; ; buffer += value & 0x7f; ; } ; for ( ; ; ) { ; *dest++ = (unsigned char)buffer; ; if (buffer & 0x80) ; buffer >>= 8; ; else ; return dest; ; } ;} option prologue:none, epilogue:none .code putvlq proc _putvlq proc ; "value" се предава в RDI, "dest" - в RSI XCHG RSI,RDI ; "value" = RSI, заради STOSB "dest" ще е в RDI MOV EAX,7F7F7F7FH ; подготви маска за буфера (в EAX заради STOSB) PDEP EAX,ESI,EAX ; разтегни в буфера значещите битове на "value" LZCNT ECX,EAX ; CL = 32 − брой значещи битове OR EAX,80808000H ; установи битовете-маркери за непоследен байт AND CL,18H ; измести буфера на кратен на 8 брой битове SHL EAX,CL ; (ако "value" = 0, изместване няма да има) BSWAP EAX ; записът започва от най-старшия байт .repeat ; for ( ; ; ) { STOSB ; *dest++ = (unsigned char)buffer; SHR EAX,8 ;___ ___ if (buffer & 0x80) .until (!carry?) ;___X___ buffer >>= 8; XCHG RAX,RDI ; else return dest; RET ; } _putvlq endp putvlq endp end