Не понятен пример из книги

Тема в разделе "WASM.BEGINNERS", создана пользователем Мановар, 4 дек 2016.

  1. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    Код (ASM):
    1. ;пример взят из книги Ю.Магда ассемблер для процессоров Intel Pentium Питер 2006 год стр 288
    2. ;взял немного другие значения чтобы не было переполнения и легче смотреть в отладчике, но суть ;от этого не меняется
    3. .686
    4. .model flat,stdcall
    5. .MMX
    6. option casemap:none
    7. _DATA SEGMENT
    8. a1 dw 45,  41,  67,  122,  61,  10,  88,  12,  62,  123,  99
    9. ;         2d   29   43   7a   3d   a     58   c    3e   7b    63
    10. len equ $-a1          ;длина массива в байтах =22
    11. res db len dup (0)
    12. _DATA ENDS
    13. _TEXT SEGMENT
    14. start:
    15. mov eax,len
    16. shr eax,1      ;приводим к размерности слова =11
    17. xor edx,edx
    18. mov ebx,2     ;вычисляем количество циклов  
    19. div ebx       ;получаем в eax  5 в edx 1
    20.              
    21. mov ecx,eax
    22. lea esi,a1
    23. lea edi,res
    24. next:
    25. movq MM0,qword ptr [esi]
    26. ;после выполнения команды получаем в отладчике содержание регистров MM0
    27. ;                       007A  0043  0029  002D   загрузили первые 4 числа
    28. packsswb MM0,qword ptr [esi+8]
    29. ;загружаем в esi еще 4 числа-  3D   A   58  C - и и упаковываем с числами содержащимися в регистре ;MM0
    30. ;на выходе получаем  0C58   0A3D   7A43   292D
    31. movq qword ptr [edi],MM0
    32. ;отправляем содержимое регистра MM0 в edi
    33. add esi,16      ;для загрузки следующих данных  3E    7B    63
    34. add edi,8       ;для записи в edi
    35. dec ecx         ;уменьшаем значение счетчика на 1
    36. ;не понимаю для чего нам нужно 5 циклов ведь мы упаковали и выгрузили 8 чисел из массива
    37. ;осталось упаковать и выгрузить еще 3 числа достаточно еще 1 цикла
    38. jnz next
    39. cmp edx,0
    40. je exit
    41. mov al,byte ptr [esi] ;у автора после 5 циклов остается 1 число которое пересылается в edi
    42. mov byte ptr [edi],al
    43. exit: lea eax,res
    44. ret
    45. _TEXT ENDS
    46. end start
     
  2. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Код (ASM):
    1.  
    2. .686
    3. .model flat,stdcall
    4. .MMX
    5. option casemap:none
    6. .data
    7. a1 dw 45, 41, 67, 122, 61, 10, 88, 12, 62, 123, 99
    8. ; 2d 29 43 7a 3d a 58 c 3e 7b 63
    9. len equ $-a1 ;длина массива в байтах =22
    10. res db len dup (0)
    11. .code
    12. start: mov ecx,sizeof a1
    13. shr ecx,1 ;приводим к размерности слова =11
    14. mov edx,ecx
    15. and edx,1
    16. shr ecx,1
    17. lea esi,a1
    18. lea edi,res
    19. next:
    20. movq MM0,qword ptr [esi]
    21. ;после выполнения команды получаем в отладчике содержание регистров MM0
    22. ; 007A 0043 0029 002D загрузили первые 4 числа
    23. packsswb MM0,qword ptr [esi+8]
    24. ;загружаем в esi еще 4 числа- 3D A 58 C - и и упаковываем с числами содержащимися в регистре ;MM0
    25. ;на выходе получаем 0C58 0A3D 7A43 292D
    26. movq qword ptr [edi],MM0
    27. ;отправляем содержимое регистра MM0 в edi
    28. add esi,16 ;для загрузки следующих данных 3E 7B 63
    29. add edi,8 ;для записи в edi
    30. loop next
    31. or edx,edx
    32. je exit
    33. mov al,byte ptr [esi] ;у автора после 5 циклов остается 1 число которое пересылается в edi
    34. mov byte ptr [edi],al
    35. exit: lea eax,res
    36. retn
    37. end start
     
    Мановар и Alexey нравится это.
  3. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    Mikl_, спасибо, но мне все же не понятно почему здесь используется 5 циклов, а не один.
    И еще вопрос, как здесь можно выделить код.
     
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    1. [соdе=asm]какая-то программа[/соdе]
    2. честно говоря, нужно два прохода
    (2Dh 29h 43h 7Ah)+(3Dh 0Ah 58h 0Ch); (3Eh 7Bh 0 0)+(63h 0 0 0)
     
    Последнее редактирование: 5 дек 2016
  5. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    Я тоже так считаю. Просто у него в книге 2 примера на упаковку чисел разной размерности. И в обоих примерах одно и то же. Я думал в начале, что просто с этим примером не разобрался, что то не до понял. Смотрю и со вторым примером то же самое. Тогда вот в ступор немного и впал. Скорее всего он просто откуда то копировал и не исправил (у Лафоре по программированию на C++ такое же встречалось). Буду считать, что у него ошибка и продолжу изучать дальше.
    Еще раз большое спасибо.
     
  6. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    создай тему "Ю.Магда ассемблер для процессоров Intel Pentium" в разделе WASM.BOOKS как раз тематика раздела это "Обсуждение книг по тематике форума, сообщения об опечатках"
     
  7. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    В книге есть еще неточности. Когда добью ее, соберу все вместе.
     
  8. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Мановар,

    лучше публиковать ошибки когда их находишь, потом, после прочтения книги будет банально лень или забудешь половину найденных ошибок :yes4:
     
  9. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    Я сейчас на работе, на вахте, времени не хватает.