Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2012, 05:34   #1
lunatik_92
 
Регистрация: 19.04.2012
Сообщений: 7
По умолчанию копирование целочисленного массива

В общем дела обстоят так :нужно выполнить копирование целочисленного массива.Программа компилится запускается но, почему-то на дебагере не проходит далее копирования 8-байтового операнда из массива-источника в регистр MM0.
Помогите найти ошибку и отладить программу.

Код:
.686
.model flat, stdcall
option casemap: none
.MMX
.code
start:
  push EBP
  mov  EBP, ESP
  mov  ESI, dword ptr [EBP+8]     ; адрес массива-источника -> ESI
  mov  EDI, dword ptr [EBP+12]    ; адрес массива-приемника -> EDI
  mov  EAX, dword ptr [EBP+16]    ; размер массива-источника в двойных
                                  ; словах -> EAX
  xor  EDX, EDX                   ; регистр EDX участвует в операции
                                  ; деления, поэтому обнуляем его
  mov  EBX, 2
  div  EBX                        ; вычислим, сколько учетверенных слов
                                  ; помещается в массиве-источнике
  mov  ECX, EAX                   ; после деления: EAX = частное,
                                  ; EDX = остаток. Количество
                                  ; учетверенных слов -> ECX (счетчик
                                  ; цикла)
next:
  movq MM0, [ESI]                 ; копировать 8-байтовый операнд
                                  ; из массива-источника в регистр MM0
  movq [EDI], MM0                 ; копировать 8-байтовый операнд из
                                  ; регистра MM0 в массив-приемник
  add  ESI, 8                     ; адрес следующего 8-байтового элемента
                                  ; массива-источника -> ESI
  add  EDI, 8                     ; адрес следующего 8-байтового элемента
                                  ; массива-приемника -> EDI
  dec  ECX                        ; уменьшить счетчик цикла на 1
  jnz  next                       ; перейти к следующей итерации
  cmp  EDX, 0                     ; остались ли в массиве-источнике
                                  ; необработанные двойные слова?
  je   exit                       ; нет, выйти из процедуры
  mov  ECX, EDX                   ; да, повторить цикл для двойных слов
  cld                             ; флаг направления -> увеличение
                                  ; адресов
next_remainder:
  movsd                           ; скопировать двойное слово из
                                  ; массива-источника в приемник
  dec  ECX                        ; декремент счетчика цикла
  jnz  next_remainder             ; если не равен 0, на следующую
                                  ; итерацию
exit:
  pop EBP
  int 21h
end start
lunatik_92 вне форума Ответить с цитированием
Старый 14.05.2012, 16:17   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Код:
 xor  EDX, EDX                   ; регистр EDX участвует в операции
                                  ; деления, поэтому обнуляем его
  mov  EBX, 2
  div  EBX                        ; вычислим, сколько учетверенных слов
                                  ; помещается в массиве-источнике
  mov  ECX, EAX                   ; после деления: EAX = частное,
                                  ; EDX = остаток. Количество
                                  ; учетверенных слов -> ECX (счетчик
                                  ; цикла)
А не проще это сделать так:
Код:
 shr eax, 1
какая вам разница, когда выравнивать массивы двойными словами - вначале или в конце массива? а так получится:

Код:
   shr eax,1
   jnc to_massiv
   movsd
to_massiv:
   ; и дальше уже оперировать 8-мибайтными регистрами
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 14.05.2012 в 16:50.
DiemonStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование целочисленного массива. lunatik_92 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 06.05.2012 08:21
По массивам, SOS! из целочисленного массива удалить из массива элементы, встречающиеся менее 3-х раз prelest' Паскаль, Turbo Pascal, PascalABC.NET 1 23.05.2011 22:37
Формирование двумерного целочисленного массива (матрицы) размером N х M zergon Помощь студентам 4 02.04.2010 16:45
Задача на Си++. Среднее геометрическое для целочисленного массива. Нataша Помощь студентам 1 20.11.2009 20:22