![Старый](images/statusicon/post_old.gif)
13.06.2015, 19:46
|
![Аватар для volod3000](image.php?s=7e4a8cd21cd81ae68dea88111666d5b0&u=5909&dateline=1308995035) |
Новичок
|
|
Регистрация: 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
|