Вообще программирую на делфе, но нужна вставочка на асме задача такая: вставить и удалить бит пример: var s : string; begin s:='hello'; asm ...//здесь мне нужно между 8тым и 9тым битом вставить свой бит (0 или 1), и удалить 20тый бит end; end; помогите пожайлуста с кодом и поясните пожайлуста
Шедевр! Куда вставлять? Попросить их подвинуться? Остроумно. Опиши подробнее задачу и зачем это нужно. Код (Text): 01101000 01100101 ^ 1 01101000 10110010 1... Так что ли?
Так, опиши, зачем это нужно, иначе твой вопрос выглядит как издевательство. Нет таких команд в x86, которые вставляли бы или удаляли биты. Можно лишь скопировать данные, "пропустив" заданный бит (чтобы удалить) или добавив ещё один. Ты в курсе, что после вставки 9 бита и смещения остальных получится "h2V67" из твоего "hello"?
"Так, опиши, зачем это нужно, иначе твой вопрос выглядит как издевательство." я хочу сделать архиватор на уровне бит, если от прояснения задачи легче "Можно лишь скопировать данные, "пропустив" заданный бит (чтобы удалить) или добавив ещё один." главное результат "Ты в курсе, что после вставки 9 бита и смещения остальных получится "h2V67" из твоего "hello"?" в курсе, так как это будет после архивации, а при разархивации, вернется на свои места
catangens Советую почитать Уоррена "Алгоритмические трюки" (Hacker's Delight by Henry S. Warren), в гл 7-4 что-то было такое.
Советую почитать Уоррена "Алгоритмические трюки" (Hacker's Delight by Henry S. Warren), в гл 7-4 что-то было такое. может подскажешь, где лежит в нете? если ты добавишь тот бит то тебе предётся последующие байты править) я думал они сами подвинуться А чё там насчет копирования с удоление, добавлением
catangens Нет, это варез. Читай правила. Интересно, ты взялся за реализацию архиватора "на уровне бит" и в то же время представления не имеешь, что такое биты и как с ними работать. Почитай одну из книг об ассеблере, раздел о битовых операциях. Может тогда прояснится.
я имею представление, что такое биты, просто 1) первый раз с ними работаю, то есть на таком низком уровне, когда нужно работать, не с многими (байтами итд), а с одним среди многих 2) я думал, что возможности асмы, позволяют сделать и такое
хы, не знать возможностей процессора по работе с данными, и пытаться спроектировать низкоуровненвый алгоритм? Тебе нужны доки по командам процессора, см. там команды xor, or, and, shr, shl и др.
Если я правильно понял a) биты нумеруются с 1 b) сдвигаются биты 9..19, а 21-32 остаются неизменными (20й выбрасывается) Тогда не мудрствуя можно сделать примерно так: Код (Text): procedure XXX(pS:pChar;Bit9:integer); [u]register[/u]; asm //eax = pS = pChar(S), edx = Bit9 = 0 или 1 push ebx mov ecx,[eax] ;ecx = 'hell' ;and edx,1 ;это на всякий случай, если Bit9 < 0 или > 1 shl edx,8 ;сдвигаем Bit9 на 9й бит mov ebx,ecx ;копия and ecx,$FFF000FF ;оставляем биты 1..8 и 21..32 shl ebx,1 ;сдвинутая копия and ebx,$000FFE00 ;оставляем биты 10..20 or ebx,ecx ;объединяем неизменные биты 1..8 и 21..32 и сдвинутые 10..20 (9й = 0) or ebx,edx ;"вставляем" 9й бит mov [eax],ebx ;записываем результат в строку pop ebx end; begin s:='hello'; XXX(pChar(s),1); end;
на самом деле речь идет о мегабайтах, как там насчет копирования с потерей (удаления) бита и копирования с добалением?
catangens Если ты в каждом дворде удаляешь 1 бит и вставляешь 1 бит, то это не влияет на следующие дворды и достаточно просто организовать цикл для того куска, который я привел. Если же ты только втавляешь или только удаляешь бит в одном дворде, то это приводит к необходимости сдвигать биты во всех последующих двордах. Эта задачка посложнее - особенно если речь идет об архиваторе и размер строки может уменьшиться в разы. Если очень хочется попробовать, то в принципе можно использовать: сдвиги через перенос rcl\rcr, двойной сдвиг shld\shrd или переходить к 64-битным операциям PSLLQ\PSRLQ на mmx или xmm регистрах. Тут уж давай сам дерзай или по крайней мере конкретизируй задачу
посмотри исходники архиватора, который сжимает текст из 8-и битного в 6-и битный. Как называется не знаю, но мож кто ссылку даст. А еще лучше сам сначала напиши.
1) может подскажите ресурс, где можно ввести названия регистров и сразу получить ответ, а то в поисковиках их описание зачастую теряется с другими 2) не помешалибы исходники для примера, где можно взять, кто подскжит, как называется хотябы???