![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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.. 
		
	
		
		
		
		
		
	
		
		
	
	
	А, учить Ассемблер на скорую руку толку не будет  |