|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Преобразовать 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 |