Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Прочие языки программирования > Assembler
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.06.2015, 19:46
Аватар для volod3000
volod3000 volod3000 вне форума
Новичок
 
Регистрация: 25.12.2008
Сообщения: 71
Репутация: 114
По умолчанию Преобразовать x86 в x64

Здравствуйте!
Я в ассемблере не силен.

Помогите преобразовать asm x86 в asm x64.
Вот код на asm x86:

Код:
asm

  // Запоминаем значение регистров в стеке
{$IFDEF CPUX86}
  push eax
  push ebx
  push ecx
  push edx
  push edi
  push esi

  mov  esi, DIBColorSrc       // карта цветов иконки
  mov  edi, DIBDest           // карта цветов фона
  //mov  ecx, DIBColorSrcSize   // размер массивов (приходит в ECX сам по себе)

  shr  ecx, 2                 // размер элемента массива равен четырем,
                              // поэтому поправим счетчик цикла

// -----------------------------------------------------------------------------

@loop:

  // цвета представленны следующим образом
  // [esi]  = синий
  // [esi + 1]  = зеленый
  // [esi + 2] = красный
  // [esi + 3]  = альфа канал

  mov  al, [esi + 3]          // читаем значение альфа канала
  cmp  al, 0                  // есть ли изображение иконки в данном пикселе?
  jne  @paint_full

  add  esi, 4                 // если нет - берем следующий элемент
  add  edi, 4
  loop @loop
  jmp  @done

// -----------------------------------------------------------------------------

@paint_full:
  cmp  al, 255                // Смотрим интенсивность цвета
  jne  @paint_alpha

  mov  eax, [esi]             // Данный пиксель полностью заполнен цветом иконки
  mov  [edi], eax             // копируем его целиком

  add  esi, 4                 // берем следующий элемент
  add  edi, 4
  loop @loop
  jmp  @done

// -----------------------------------------------------------------------------

@paint_alpha:

  // присутствует альфаканал

  xor  ebx, ebx
  call @make_alpha            // микшируем синий цвет
  inc  ebx
  call @make_alpha            // микшируем зеленый цвет
  inc  ebx
  call @make_alpha            // микшируем красный цвет

  add  esi, 4                 // берем следующий элемент
  add  edi, 4
  loop @loop
  jmp  @done

// -----------------------------------------------------------------------------

@make_alpha:

  // функция смешивает два цвета в зависимости от значения EBX,
  // которое указывает какой именно брать байт из RGB

  xor  eax, eax
  xor  edx, edx
  mov  al, byte [edi + ebx]   // берем цвет приемника
  mov  dl, byte [esi + 3]     // берем значение альфаканала
  not  dl                     // значение альфаканала вычитаем из 255
  mul  dl                     // умножаем на получившееся значение
  or   dl, $FF
  div  dl                     // делим на 255

  mov  byte [edi + ebx], al   // запоминаем первый результат

  xor  eax, eax
  xor  edx, edx
  mov  al, byte [esi + ebx]   // берем цвет источника
  mov  dl, byte [esi + 3]     // берем значение альфаканала
  mul  dl                     // умножаем на значение альфаканала
  or   dl, $FF
  div  dl                     // делим на 255

  xor  edx, edx
  mov  dl, byte [edi + ebx]   // читаем первый результат
  add  ax, dx                 // к нему прибавляем второй результат
  mov  byte [edi + ebx], al   // сумму помещаем обратно

  ret

// -----------------------------------------------------------------------------

@done:

  // Восстановление значений регистров из стека

  pop  esi
  pop  edi
  pop  edx
  pop  ecx
  pop  ebx
  pop  eax
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter