|
|
Регистрация | << Правила форума >> | 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 |
#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] А курить этот код для полноценной переделки как-то совсем нет желания. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 13.06.2015 в 20:21. |
#3
|
||||
|
||||
Переписать на паскаль и нии баста.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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.. Тем более, что этот код даже не пытались оптимизировать, и написан он левой пяткой через правое ухо, а потому толку от асм реализации немного.
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 13.06.2015 в 23:21. |
#6
|
||||
|
||||
Видимо да, лучше последовать совету M.A.D.M.A.N..
А, учить Ассемблер на скорую руку толку не будет |