Команды двойного смещения также делают возможным :
Быструю вставку битовой строки из регистра в произвольное местоположение бита в большей битовой строке в памяти, без нарушения битов по обеим сторонам от вставляемых битов.
Быстрое исключение битовой строки в регистр с произвольного местоположения в большей битовой строке в памяти, без нарушения битов по обеим сторонам от исключаемых битов.
Следующие примеры программ иллюстрируют вставку и исключение битов при различных условиях :
Вставка битовой строки в память (когда битовая строка длиной от 1 до 25 бит, т.е. вставить 4 байта или меньше) :
2. ; Вставить выровненную по правому краю битовую строку из регистра3. ; в битовую строку в памяти.4. ;5. ; Допущения :6. ; 1. Основание массива строки выровнено по двойным словам.7. ; 2. Длина битовой строки задана непосредственно значением и8. ; битовое смещение содержится в регистре.9. ;10. ; Регистр ESI содержит выровненную по правому краю битовую11. ; строку, которую надо вставить.12. ; Регистр EDI содержит битовое смещение начальной позиции13. ; подстроки.14. ; Также используются регистры EAX и ECX.15. ;16. MOV ECX,EDI ; сохранить исходное смещение17. SHR EDI,3 ; разделить смещение на 8 (адрес байта)18. AND CL,7H ; получить три младших бита смещения19. MOV EAX,[EDI]strg_base ; переместить строку длиной в двойное20. ; слово в EAX21. RDR EAX,CL ; правое выравнивание поля старых22. ; битов23. SHRD EAX,ESI,длина ; получили новые биты24. ROL EAX,длина ; правое выравнивание поля новых битов25. ROL EAX,CL ; доставить в конечную позицию26. MOV [EDI]strg_base,EAX ; заменить двойное слово в памяти
Вставка битовой строки в память (когда битовая строка длиной от 1 до 31 битa, т.е. вставить 5 байт или меньше) :
28. ; Вставить выровненную по правому краю битовую строку из регистра29. ; в битовую строку в памяти.30. ;31. ; Допущения :32. ; 1. База массива строки выровнена по двойным словам.33. ; 2. Длина битовой строки задана непосредственно значением и34. ; битовое смещение содержится в регистре.35. ;36. ; Регистр ESI содержит выровненную по правому краю битовую37. ; строку, которую надо вставить.38. ; Регистр EDI содержит битовое смещение начальной позиции39. ; подстроки.40. ; Также используются регистры EAX, EBX, ECX и EDI.41. ;42. MOV ECX,EDI ; временно сохранить смещение43. SHR EDI,5 ; разделить смещение на 32 (двойное44. ; слово)45. SHL EDI,2 ; умножить на 4 (адрес байта)46. AND CL,1FH ; получить пять младших битов смещения47. MOV EAX,[EDI]strg_base ; переместить младшую строку длиной в48. ; двойное слово в EAX49. MOV EDX,[EDI]strg_base+4 ; переместить оставшуюся строку50. ; длиной в двойное слово в EDX51. MOV EBX,EAX ; временное сохранение части строки52. SHRD EAX,EDX,CL ; смещение на заданное число бит53. ; внутри двойного слова54. 55. SHRD EAX,EBX,CL ; смещение на заданное число бит56. ; внутри двойного слова57. SHRD EAX,ESI,длина ; получили новые биты58. ROL EAX,длина ; правое выравнивание поля новых битов59. MOV EBX,EAX ; временное сохранение строки60. SHLD EAX,EDX,CL ; смещение на заданное число бит61. ; внутри слова62. SHLD EDX,EDX,CL ; смещение на заданное число бит63. ; внутри слова64. MOV [EDI]strg_base,EAX ; заменить двойное слово в памяти65. MOV [EDI]strg_base+4,EDX ; заменить двойное слово в памяти
Вставка битовой строки в память (когда битовая строка длиной 32 битa, т.е. вставить 4 или 5 байт) :
67. ; Вставить выровненную по правому краю битовую строку из68. ; регистра в битовую строку в памяти.69. ;70. ; Допущения :71. ; 1. База массива строки выровнена по двойным словам.72. ; 2. Длина битовой строки 32 бита и битовое смещение73. ; содержится в регистре.74. ;75. 76. ; Регистр ESI содержит 32-битовую строку, которую надо вставить.77. ; Регистр EDI содержит битовое смещение начальной позиции78. ; подстроки.79. ; Также используются регистры EAX, EBX, ECX и EDI.80. ;81. MOV EDX,EDI ; сохранить исходное смещение82. SHR EDI,5 ; разделить смещение на 32 (двойное83. ; слово)84. SHL EDI,2 ; умножить на 4 (адрес байта)85. AND CL,1FH ; изолировать пять младших битов86. ; смещения87. MOV EAX,[EDI]strg_base ; переместить младшую строку длиной в88. ; двойное слово в EAX89. MOV EDX,[EDI]strg_base+4 ; переместить оставшуюся строку90. ; длиной в двойное слово в EDX91. MOV EBX,EAX ; временное сохранение части строки92. SHRD EAX,EDX ; смещение на заданное число бит93. ; внутри двойного слова94. SHRD EDX,EBX ; смещение на заданное число бит95. ; внутри двойного слова96. MOV EAX,ESI ; переместить 32-разрядное поле в97. ; положение98. MOV EBX,EAX ; временное сохранение части строки99. SHLD EAX,EDX ; смещение на заданное число бит100. ; внутри слова101. SHLD EDX,EBX ; смещение на заданное число бит102. ; внутри слова103. MOV [EDI]strg_base,EAX ; заменить двойное слово в памяти104. MOV [EDI]strg_base+4,EDX ; заменить двойное слово в памяти
Изъятие битовой строки из памяти (когда битовая строка длиной от 1 до 25 бит, т.е. изъять 4 байта или меньше) :
106. ; Изъять выровненную по правому краю битовую строку в регистр107. ; из битовой строки в память.108. ;109. ; Допущения :110. ; 1. База массива строки выровнена по двойным словам.111. ; 2. Длина битовой строки задана непосредственно значением и112. ; битовое смещение содержится в регистре.113. ;114. ; Регистр EAX содержит выровненную по правому краю дополненную115. ; нулями битовую строку, которую надо изъять.116. ; Регистр EDI содержит битовое смещение начальной позиции117. ; подстроки.118. ; Также используются регистры EDI и ECX.119. ;120. MOV ECX,EDI ; временное сохранение смещения121. SHR EDI,3 ; разделить смещение на 8 (адрес байта)122. AND CL,7H ; получить три младших бита смещения123. MOV EAX,[EDI]strg_base ; переместить строку длиной в двойное124. ; слово в EAX125. SHR EAX,CL ; смещение на заданное количество126. ; битов внутри двойного слова127. AND EAX,маска ; изъять битовое поле в EAX
Изъятие битовой строки из памяти (когда битовая строка длиной от 1 до 32 бит, т.е. изъять 5 байт или меньше) :
129. ; Изъять выровненную по правому краю битовую строку в регистр130. ; из битовой строки в памяти.131. ;132. ; Допущения :133. ; 1. База массива строки выровнена по двойным словам.134. ; 2. Длина битовой строки задана непосредственно значением и135. ; битовое смещение содержится в регистре.136. ;137. ; Регистр EAX содержит выровненную по правому краю дополненную138. ; нулями битовую строку, которую надо изъять.139. ; Регистр EDI содержит битовое смещение начальной позиции140. ; подстроки.141. ; Также используются регистры EAX, EBX и ECX.142. ;143. MOV ECX,EDI ; временно сохранить смещение144. SHR EDI,5 ; разделить смещение на 32 (двойное145. ; слово)146. SHL EDI,2 ; умножить на 4 (адрес байта)147. AND CL,1FH ; получить пять младших битов смещения148. MOV EAX,[EDI]strg_base ; переместить младшую строку длиной в149. ; двойное слово в EAX150. MOV EDX,[EDI]strg_base+4 ; переместить оставшуюся строку151. ; длиной в двойное слово в EDX152. SHRD EAX,EDX,CL ; смещение на заданное число бит153. ; внутри двойного слова154. SHRD EAX,EDX,CL ; смещение на заданное число бит155. ; внутри двойного слова156. AND EAX,маска ; изъять битовое поле в EAX