Задачка о новом процессоре

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 6 июн 2008.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    _basmp_
    Вообще идея очень оригинальная, а если бы bsf и bsr могли сканировать всю память, то можно было бы и до 2^32 считать. Кстати, у нас ведь еще есть scasb, может с ним попробовать? :)
    Но на самом деле изменённый формат тоже позволяет от 0 до 2^32-1 считать и памяти не намного больше ест.
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Black_mirror
    Любая работа с памятью как минимум на порядок медленее работы с регистрами. Имхо быстрее сдвигать по 5 бит или по 6 (shrd,shld).

    Только счас допер: rep не забанен и флаг направления тоже.. Не получится. Не вся память доступна для чтения и порты тоже.
     
  3. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    непонимать, решение же простое
    Код (Text):
    1. ; not eax
    2.         mov     ecx, 33
    3. @@:
    4.         adc     eax, eax
    5.         cmc
    6.         loop    @B
     
  5. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Продолжая издеваться над форматом храним числа через байт XBn...XB1XB0. Те в 32х битной переменной лежит 16 битное число

    xor eax,ebx
    ==
    and eax,0101010101010101b
    and ebx,0101010101010101b
    add eax,ebx


    sum eax,ebx
    ==
    or eax,1010101010101010b
    and ebx,0101010101010101b
    add eax,ebx


    not eax
    ==
    and eax,0101010101010101b
    add eax,0101010101010101b


    neg eax
    ==
    not eax
    or eax,1010101010101010b
    add eax,1


    sub eax,ebx
    ==
    neg ebx
    sum eax,ebx

    Пока все.
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    KeSqueer
    Простое, но не эффективное!

    _basmp_
    Идея очень хорошая! До получения философского камня, то есть NOT для всех 32х разрядов осталось совсем не много.
    Ну еще нужно упаковать пару таких чисел в 32 разряда, потому что ставить 4Гб чтобы адресоваться только к 64К не рационально :)
     
  7. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Black_mirror
    not eax ; uses ebx
    ==
    mov ebx,eax
    and eax,0101010101010101b
    add eax,0101010101010101b
    and eax,0101010101010101b

    and ebx,1010101010101010b
    add ebx,1010101010101010b
    and ebx,1010101010101010b

    or eax,ebx
     
  8. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    _basmp_
    Замечательно! Теперь осталось придумать структуру, чтобы не только NOT (его можно будет и за меньшее число команд сделать), а так же ADD, SUB, AND, OR, XOR можно было не более чем за 8 команд выполнить (полученный NOT для этих операций будет не очень полезен :)
     
  9. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    Странно както делать проц - реализовать всю логику и битовые операции, а для орифметики оставить только сумму. Темболее OR AND XOR и NOT это бызывые элементы. Тот же сумматор например на них строится.
    Да и в здравом уме никто не будет делать полу x86 тк его архитектура команд уже устарела с 90го года.

    Такое ощущение Black_mirror ,что тебе дали задание (препод наверно),а ты хитрым способом хочеш пролесть за чужой счет.
    Лучшеб сделел топик "разминка для ума", а не придумывал всю эту ахинею.
     
  10. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    SWR
    Эта тема как раз и есть "разминка для ума". Жаль только что это не всем очевидно.
    Как видишь NOT уже сделали, так что, несмотря на заявления предсказателей "Без NOT изначально мертвый проц.", проц очень даже не мёртвый (он просто еще не родившийся :)
    Сумматор у него есть (так же как и AND и OR), значит где-то внутри сумматора есть и NOT и XOR, главное их от туда достать.
    А если эта задачка не нравится, то можешь порешать другие:
    http://www.wasm.ru/forum/viewtopic.php?id=27319
    http://www.wasm.ru/forum/viewtopic.php?id=27313
    ну и еще целая куча задачек на форуме есть.
     
  11. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Такой ксор подойдет?
    xor eax,XXXXXXXX
    ==============
    push ebx
    push ecx
    mov ebx,XXXXXXXX
    mov ecx,33 ;21h
    loop:
    dec ecx
    jz ex
    test ebx,1
    jz @f ; если первый бит 0
    test eax,1
    jz inc_ ;tесли 0 то включаем бит
    ;если не 0 то выключаем
    and eax,11111110b
    jmp @f
    inc_:
    or eax,00000001b
    jmp @f
    @@:
    ror eax,1
    ror ebx,1
    jmp loop
    EX:
    pop ecx
    pop ebx
     
  12. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    PaCHER
    Неа, у нас уже есть NOT в 8 команд. Если добавить к нему 1, то получим NEG A за 9 команд, если добавим B, то получим B-A за 10 команд, если к (A or B) добавим NOT(A and B)+1, то получим XOR за 13 команд. А если придумаем другую структуру для хранения чисел, то получим все эти операции не более чем за 8 команд.