Помогите что ли решить задачку ( очень простую)

Тема в разделе "WASM.BEGINNERS", создана пользователем MetAlic, 10 окт 2009.

  1. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    В Исходном байте Databyte биты 0..3 содержат двоичный код, который обозначим как А, биты 4..5 - код, который обозначим как В, биты 6..7 - код, который обозначим как С.
    Вычислить А+2*В+2*С.

    Собственно, программа написана-то.
    Только как-то кривовато мне кажется. А _кардинально_ по дугому я не могу что-то додуматься как решить. Интересно, какие есть другие варианты.
    Решать именно через лог. операции, сдвиги , выделение битовых полей и т.д. логические операции, сдвиги, выделения

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. includelib d:\masm32\lib\kernel32.lib
    4.  
    5. ExitProcess proto: DWORD
    6.  
    7. .data
    8.         DataByte DB 51h    ;0101 0001b
    9.        
    10. .code
    11.     start:
    12.        
    13.         mov al, DataByte    
    14.         shr al, 6            ; al = C = 0000 0001b
    15.        
    16.         sub ebx, ebx
    17.         mov bl, DataByte
    18.         shl bl, 5
    19.         shr bl, 5            ; bl = A = 0000 0001b
    20.        
    21.         sub ecx, ecx
    22.         mov cl, DataByte
    23.         shl cl, 2
    24.         shr cl, 6            ; cl = B = 0000 0001b
    25.        
    26.         ;=========== Начинаем считать ===========
    27.         ;=============== A+2*B+2*C ==============
    28.        
    29.         shl cl, 1            ; 2*B = 01h * 2 = 2 = 0010b
    30.         add bl, cl           ; bl = A+2*B
    31.         shl al, 1            ; 2*C = 01h * 2 = 2 = 0010b
    32.         add al,bl            ; al = A+2*B+2*C
    33.                
    34.        
    35.         push 0
    36.         call ExitProcess
    37.     end start
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1.         movzx eax, byte [testdata]
    2.         mov ebx, eax
    3.         mov ecx, eax
    4.         and eax, 0x0F
    5.         and ebx, 0x30
    6.         shr ebx, 3
    7.         and ecx, 0xC0
    8.         shr ecx, 5
    9.         add eax, ebx
    10.         add eax, ecx
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. movzx eax, byte [testdata]
    2. mov ebx, eax
    3. mov ecx, eax
    4. and eax, 0x0F
    5. and ebx, 0x30
    6. and ecx, 0xC0
    7. lea  ecx,[ecx+ebx*4]
    8. shr ecx, 5
    9. add eax, ecx
     
  4. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    n0name, идею понял, но :

    ...
    mov ecx, eax
    ...
    and ecx, 0xC0
    shr ecx, 5
    Ты пытаешься выразить биты, а тут, в есх кидаем, например, 51н = 0101 0001b , дальше and
    0101 0001
    0001 0010

    это будет - 0001 0000, и shr,5. это занулит регистр полностью. Смысл?

    В других регистрах будет 11 и 8 = 19. Ответ неправильный.
    При ,например, вводе 51h вывод должен быть равен 5.

    И вообще, по заданию нужно выделить биты. _Я_ так понимаю то естьо их вывести отдельно надо. Как отдельные числа. То есть там будет 01h, 01h, 01h соотвественно во всех 3-х случаях. А у тебя 8 и 11.

    Freeman , у тебя 3 выходит. Должнол быть пять.
    Но дело не в этом. Я задачу что ли не так понял? По идее биты нужно вытаскивать, а вашу логику я не понимаю )

    и почему вы пишите byte, если по идее надо byte ptr [testbyte]. Во всяком случае только так работает
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    хы. а йа то думал, что 0c0h = 11000000b
    fasm синтаксес рулит
    выходет 5, внимательней проверяйте
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    у меня всё верно, это у тебя проблемы с арифметикой.
    Не веришь мне? Проверь дебаггером ;)
     
  7. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    так.ясно. я накосячил.
    Но все равно выходит 3. Копирую код , добавляю только "ptr". Запускаю в отлоадчике. В еах лежит 3. Или я опять накосячил?
     
  8. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    n0name, проверил. И у тебя тройка теперь)

    Ну..вот что показывает ольга после кода

    EAX 00000003
    ECX 00000000
    EDX 7C90E514 ntdll.KiFastSystemCallRet
    EBX 00000002
    ESP 0012FFC0
    EBP 0012FFF0
    ESI FFFFFFFF
     
  9. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    EAX 00000003
    ECX 00000002
    EDX 7C90E514 ntdll.KiFastSystemCallRet
    EBX 00000010
    ESP 0012FFC4
    EBP 0012FFF0
    ESI FFFFFFFF
    EDI 7C910228 ntdll.7C910228

    А это после кода фримена
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    пошагово проверь, неправильно код скопипастил.
     
  11. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    ну как неправильно? ctrl c - ctrl v. Дописал ptr..Протрассировал f8

    EAX 00000003
    ECX 00000000
    EDX 7C90E514 ntdll.KiFastSystemCallRet
    EBX 00000002
    ESP 0012FFC0
    EBP 0012FFF0
    ESI FFFFFFFF

    А у тебя под отладчиком пять?
     
  12. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    хоман идёт на помосч)
     
  13. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    x0man, спасибо) Обнаружил страшно позорный косяк у себя)

    Все работает, ребят. Всем спасибо.

    Вот так простая программка,а косяков вылезло) Опыт е-мое..
     
  14. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    Так. А кто-нибудь может предложить еще один вариант, _кардинально_ другой? Просто интересны варианты.

    Можно в моем коде заменить shl(r) на лог. операции, но тогда сработает только под конкретное число,а это не гуд.
     
  15. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    Кто-нибудь скажет, почему hiew не открывает созданные программы? Пишет,мол прога не может запускаться в дос режиме.
     
  16. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    вопрос отпал )
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.905
    Наверное всё таки A+B*2^4 + C*2^6 тогда
    Код (Text):
    1.      mov ecx,C
    2.      and ecx,11b
    3.      mov ebx,B
    4.      and ebx,11b
    5.      mov eax,A
    6.      and eax,1111b
    7.      lea ebx,[ebx+ecx*2]
    8.      lea eax,[eax+ebx*4]
     
  18. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Код (Text):
    1. mov  eax,X
    2. shl  ax,2
    3. shl  ah,4
    4. shl  ax,2
    5. shr  al,4
    6. shl  eax,3
    7. shr  ax,3
    8. shl  ah,1
    9. imul eax,10000000100000001b
    10. shr  eax,16
    11. and  eax,255
    В eax будет А+2*В+2*С.
     
  19. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    эээ...с чего это?) прмиер тот,который я написал.

    А за решение примера, которого не просил - спасибо
     
  20. MetAlic

    MetAlic New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    111
    murder, спс.

    Сможет еще кто-нибудь другое решение сделать?)