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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2015, 19:43   #1
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию Преобразовать 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

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 13.06.2015, 21:54   #2
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Вот так сделал:

Код:
push rax
  push rbx
  push rcx
  push rdx
  push rdi
  push rsi

  mov  rsi, DIBColorSrc       // карта цветов иконки
  mov  rdi, DIBDest           // карта цветов фона
  //mov  rcx, DIBColorSrcSize   // размер массивов (приходит в rcx сам по себе)

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

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

@loop:

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

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

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

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

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

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

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

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

@paint_alpha:

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

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

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

@make_alpha:

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

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

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

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

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

  ret

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

@done:

  // Восстановление значений регистров из стека
  
  pop  rsi
  pop  rdi
  pop  rdx
  pop  rcx
  pop  rbx
  pop  rax
end;
но дает ошибку:


Цитата:
Access violation at address 0000000000406B5D in module 'Project1.exe'. Write of address 0000000000000727.

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 13.06.2015, 21:58   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Отладку делать не пытался?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.06.2015, 22:04   #4
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Отладку делать не пытался?
Заходит в стопор

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 13.06.2015, 22:13   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
loop @loop
А какое значение в RCX?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.06.2015, 22:49   #6
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

В коде вроде всё нормально, это только отладчиком смотреть.

А правильней всего будет выкинуть весь этот быдлокод (да-да, ассемблерный быдлокод ради экономии на спичках) и переписать на Delphi. Не вижу какой-то особенной математики, которую непременно надо на по железу гонять. Обработка альфа-каналов в иконках -- тьфу, в инете кода наверняка завались. А на отладку этого ассемблера запросто можно полдня убить или даже весь день, особенно если с непривычки.
Vapaamies вне форума Ответить с цитированием
Старый 13.06.2015, 23:05   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А мне вот это не понравилось:
Цитата:
//mov rcx, DIBColorSrcSize // размер массивов (приходит в rcx сам по себе)
Чейт падазрительна...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi доступ к x64 ветке реестра из x86 проги Raf-9600 Помощь студентам 6 19.07.2012 13:29
Системный программист - разработчик C/C++ (платформа Windows x86/x64) api_soft Фриланс 1 16.02.2012 12:06
Win7 x64 и Win7 x86, возможно ли? Пепел Феникса Операционные системы общие вопросы 9 11.12.2011 14:09
Разрядность ОСи x86/x64 Veiron Win Api 11 13.12.2010 17:26
Переписать программку с x86 под x64 PnG Фриланс 6 02.11.2009 11:24