На уровни бит

Тема в разделе "WASM.BEGINNERS", создана пользователем catangens, 11 сен 2005.

  1. catangens

    catangens New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    25
    Вообще программирую на делфе, но нужна вставочка на асме

    задача такая:

    вставить и удалить бит

    пример:

    var

    s : string;

    begin

    s:='hello';

    asm

    ...//здесь мне нужно между 8тым и 9тым битом вставить свой бит (0 или 1), и удалить 20тый бит

    end;



    end;



    помогите пожайлуста с кодом и поясните пожайлуста
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Шедевр! Куда вставлять? Попросить их подвинуться?





    Остроумно.



    Опиши подробнее задачу и зачем это нужно.
    Код (Text):
    1.  
    2. 01101000 01100101
    3.          ^
    4.          1
    5.  
    6. 01101000 10110010 1...


    Так что ли?
     
  3. catangens

    catangens New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    25
    да действительно попрасить подвинуться, как в примере в котором Вы привели
     
  4. catangens

    catangens New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    25
    а описать я просил команды, которые будут вставлять и удалять биты
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Так, опиши, зачем это нужно, иначе твой вопрос выглядит как издевательство.



    Нет таких команд в x86, которые вставляли бы или удаляли биты. Можно лишь скопировать данные, "пропустив" заданный бит (чтобы удалить) или добавив ещё один.



    Ты в курсе, что после вставки 9 бита и смещения остальных получится "h2V67" из твоего "hello"?
     
  6. catangens

    catangens New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    25
    "Так, опиши, зачем это нужно, иначе твой вопрос выглядит как издевательство."



    я хочу сделать архиватор на уровне бит, если от прояснения задачи легче





    "Можно лишь скопировать данные, "пропустив" заданный бит (чтобы удалить) или добавив ещё один."



    главное результат





    "Ты в курсе, что после вставки 9 бита и смещения остальных получится "h2V67" из твоего "hello"?"



    в курсе, так как это будет после архивации, а при разархивации, вернется на свои места
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    catangens

    Советую почитать Уоррена "Алгоритмические трюки" (Hacker's Delight by Henry S. Warren), в гл 7-4 что-то было такое.
     
  8. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    если ты добавишь тот бит то тебе предётся последующие байты править)
     
  9. catangens

    catangens New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    25
    Советую почитать Уоррена "Алгоритмические трюки" (Hacker's Delight by Henry S. Warren), в гл 7-4 что-то было такое.



    может подскажешь, где лежит в нете?



    если ты добавишь тот бит то тебе предётся последующие байты править)



    я думал они сами подвинуться







    А чё там насчет копирования с удоление, добавлением
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    catangens

    Нет, это варез. Читай правила.





    Интересно, ты взялся за реализацию архиватора "на уровне бит" и в то же время представления не имеешь, что такое биты и как с ними работать.



    Почитай одну из книг об ассеблере, раздел о битовых операциях. Может тогда прояснится.
     
  11. catangens

    catangens New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    25
    я имею представление, что такое биты, просто

    1) первый раз с ними работаю, то есть на таком низком уровне, когда нужно работать, не с многими (байтами итд), а с одним среди многих

    2) я думал, что возможности асмы, позволяют сделать и такое
     
  12. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    ну поваляют наверна)

    просто для вставки бита предётся другие биты тоже сдвигать)
     
  13. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    хы, не знать возможностей процессора по работе с данными, и пытаться спроектировать низкоуровненвый алгоритм?



    Тебе нужны доки по командам процессора, см. там команды xor, or, and, shr, shl и др.
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если я правильно понял

    a) биты нумеруются с 1

    b) сдвигаются биты 9..19, а 21-32 остаются неизменными (20й выбрасывается)

    Тогда не мудрствуя можно сделать примерно так:
    Код (Text):
    1. procedure XXX(pS:pChar;Bit9:integer); [u]register[/u];
    2. asm //eax = pS = pChar(S), edx = Bit9 = 0 или 1
    3.     push ebx
    4.     mov ecx,[eax]     ;ecx = 'hell'
    5.     ;and edx,1        ;это на всякий случай, если Bit9 < 0 или > 1
    6.     shl edx,8         ;сдвигаем Bit9 на 9й бит
    7.     mov ebx,ecx       ;копия
    8.     and ecx,$FFF000FF ;оставляем биты 1..8 и 21..32
    9.     shl ebx,1         ;сдвинутая копия
    10.     and ebx,$000FFE00 ;оставляем биты 10..20
    11.     or  ebx,ecx       ;объединяем неизменные биты 1..8 и 21..32 и сдвинутые 10..20 (9й = 0)
    12.     or  ebx,edx       ;"вставляем" 9й бит
    13.     mov [eax],ebx     ;записываем результат в строку
    14.     pop ebx
    15. end;
    16. begin
    17.     s:='hello';
    18.     XXX(pChar(s),1);
    19. end;
     
  15. catangens

    catangens New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    25
    на самом деле речь идет о мегабайтах, как там насчет копирования с потерей (удаления) бита и копирования с добалением?
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    catangens

    Если ты в каждом дворде удаляешь 1 бит и вставляешь 1 бит, то это не влияет на следующие дворды и достаточно просто организовать цикл для того куска, который я привел.



    Если же ты только втавляешь или только удаляешь бит в одном дворде, то это приводит к необходимости сдвигать биты во всех последующих двордах. Эта задачка посложнее - особенно если речь идет об архиваторе и размер строки может уменьшиться в разы. Если очень хочется попробовать, то в принципе можно использовать: сдвиги через перенос rcl\rcr, двойной сдвиг shld\shrd или переходить к 64-битным операциям PSLLQ\PSRLQ на mmx или xmm регистрах. Тут уж давай сам дерзай или по крайней мере конкретизируй задачу
     
  17. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    посмотри исходники архиватора, который сжимает текст из 8-и битного в 6-и битный. Как называется не знаю, но мож кто ссылку даст.

    А еще лучше сам сначала напиши.
     
  18. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    я думаю ему неподойдёт не универсальный однако, не все байты в текте задействованы
     
  19. catangens

    catangens New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    25
    1) может подскажите ресурс, где можно ввести названия регистров и сразу получить ответ, а то в поисковиках их описание зачастую теряется с другими

    2) не помешалибы исходники для примера, где можно взять, кто подскжит, как называется хотябы???
     
  20. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348




    Ответ на что? Назначение этого регистра? Это есть в любой книжке по ассемблеру.