![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте!
Я в ассемблере не силен. Помогите преобразовать 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
|
|
#2
|
||||
|
||||
|
Код:
push eax -> push rax push ebx -> push rbx push ecx -> push rcx ... mov esi, * -> mov rsi, * ... mov eax, [esi] -> mov eax, [rsi] mov [edi], eax -> mov [rdi], eax ... inc eax -> inc rax ... mov al, byte [edi + ebx] -> mov al, byte [rdi + rbx] А курить этот код для полноценной переделки как-то совсем нет желания. Последний раз редактировалось Bargest, 13.06.2015 в 20:21. |
|
#3
|
||||
|
||||
|
Переписать на паскаль и нии баста.
|
|
#4
|
||||
|
||||
|
Вот так сделал:
Код:
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;но дает ошибку: Цитата:
|
|
#5
|
||||
|
||||
|
Отлаживать надо. Смотреть, на какой команде падает (адрес в ошибке указан) и почему. Проверять типы аргументов (DIBColorSrc и второго). Без знаний ассемблера ничего не выйдет. Так что лучше последовать совету M.A.D.M.A.N.. Тем более, что этот код даже не пытались оптимизировать, и написан он левой пяткой через правое ухо, а потому толку от асм реализации немного.
Последний раз редактировалось Bargest, 13.06.2015 в 23:21. |
|
#6
|
||||
|
||||
|
Видимо да, лучше последовать совету M.A.D.M.A.N..
А, учить Ассемблер на скорую руку толку не будет |