Код (ASM): ;пример взят из книги Ю.Магда ассемблер для процессоров Intel Pentium Питер 2006 год стр 288 ;взял немного другие значения чтобы не было переполнения и легче смотреть в отладчике, но суть ;от этого не меняется .686 .model flat,stdcall .MMX option casemap:none _DATA SEGMENT a1 dw 45, 41, 67, 122, 61, 10, 88, 12, 62, 123, 99 ; 2d 29 43 7a 3d a 58 c 3e 7b 63 len equ $-a1 ;длина массива в байтах =22 res db len dup (0) _DATA ENDS _TEXT SEGMENT start: mov eax,len shr eax,1 ;приводим к размерности слова =11 xor edx,edx mov ebx,2 ;вычисляем количество циклов div ebx ;получаем в eax 5 в edx 1 mov ecx,eax lea esi,a1 lea edi,res next: movq MM0,qword ptr [esi] ;после выполнения команды получаем в отладчике содержание регистров MM0 ; 007A 0043 0029 002D загрузили первые 4 числа packsswb MM0,qword ptr [esi+8] ;загружаем в esi еще 4 числа- 3D A 58 C - и и упаковываем с числами содержащимися в регистре ;MM0 ;на выходе получаем 0C58 0A3D 7A43 292D movq qword ptr [edi],MM0 ;отправляем содержимое регистра MM0 в edi add esi,16 ;для загрузки следующих данных 3E 7B 63 add edi,8 ;для записи в edi dec ecx ;уменьшаем значение счетчика на 1 ;не понимаю для чего нам нужно 5 циклов ведь мы упаковали и выгрузили 8 чисел из массива ;осталось упаковать и выгрузить еще 3 числа достаточно еще 1 цикла jnz next cmp edx,0 je exit mov al,byte ptr [esi] ;у автора после 5 циклов остается 1 число которое пересылается в edi mov byte ptr [edi],al exit: lea eax,res ret _TEXT ENDS end start
Код (ASM): .686 .model flat,stdcall .MMX option casemap:none .data a1 dw 45, 41, 67, 122, 61, 10, 88, 12, 62, 123, 99 ; 2d 29 43 7a 3d a 58 c 3e 7b 63 len equ $-a1 ;длина массива в байтах =22 res db len dup (0) .code start: mov ecx,sizeof a1 shr ecx,1 ;приводим к размерности слова =11 mov edx,ecx and edx,1 shr ecx,1 lea esi,a1 lea edi,res next: movq MM0,qword ptr [esi] ;после выполнения команды получаем в отладчике содержание регистров MM0 ; 007A 0043 0029 002D загрузили первые 4 числа packsswb MM0,qword ptr [esi+8] ;загружаем в esi еще 4 числа- 3D A 58 C - и и упаковываем с числами содержащимися в регистре ;MM0 ;на выходе получаем 0C58 0A3D 7A43 292D movq qword ptr [edi],MM0 ;отправляем содержимое регистра MM0 в edi add esi,16 ;для загрузки следующих данных 3E 7B 63 add edi,8 ;для записи в edi loop next or edx,edx je exit mov al,byte ptr [esi] ;у автора после 5 циклов остается 1 число которое пересылается в edi mov byte ptr [edi],al exit: lea eax,res retn end start
Mikl_, спасибо, но мне все же не понятно почему здесь используется 5 циклов, а не один. И еще вопрос, как здесь можно выделить код.
[соdе=asm]какая-то программа[/соdе] честно говоря, нужно два прохода (2Dh 29h 43h 7Ah)+(3Dh 0Ah 58h 0Ch); (3Eh 7Bh 0 0)+(63h 0 0 0)
Я тоже так считаю. Просто у него в книге 2 примера на упаковку чисел разной размерности. И в обоих примерах одно и то же. Я думал в начале, что просто с этим примером не разобрался, что то не до понял. Смотрю и со вторым примером то же самое. Тогда вот в ступор немного и впал. Скорее всего он просто откуда то копировал и не исправил (у Лафоре по программированию на C++ такое же встречалось). Буду считать, что у него ошибка и продолжу изучать дальше. Еще раз большое спасибо.
создай тему "Ю.Магда ассемблер для процессоров Intel Pentium" в разделе WASM.BOOKS как раз тематика раздела это "Обсуждение книг по тематике форума, сообщения об опечатках"
Мановар, лучше публиковать ошибки когда их находишь, потом, после прочтения книги будет банально лень или забудешь половину найденных ошибок