elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Funcion equivalente en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funcion equivalente en C  (Leído 473 veces)
Kougami

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Funcion equivalente en C
« en: 23 Mayo 2017, 14:12 »

Buenas, escribia porque no se como sacar una funcion equivalente en C del siguiente codigo escrito en asm:
Código
  1. .global rgb2gray
  2.  
  3. .equ COEF1, 3483
  4. .equ COEF2, 11718
  5. .equ COEF3, 1183
  6.  
  7. .text
  8.  
  9. rgb2gray:
  10.   ldr r3, =COEF1
  11.   mul r0, r3, r0
  12.   ldr r3, =COEF2
  13.   mla r0, r3, r1, r0
  14.   ldr r3, =COEF3
  15.   mla r0, r3, r2, r0
  16.   mov r0, r0, lsr #14
  17.  
  18.   mov pc, lr
  19.  

Si me pudieseis ayudar estaria genial.
Muchas gracias de antemano


En línea

cpu2


Desconectado Desconectado

Mensajes: 924


Ver Perfil
Re: Funcion equivalente en C
« Respuesta #1 en: 23 Mayo 2017, 17:06 »

No es el lugar indicado, si comprendes el codigo en ASM escribe un pseudocode y colocalo en el sub-foro de C/C++, hay si que pueden ayudarte.

Un saludo.


En línea

NEBIRE


Desconectado Desconectado

Mensajes: 576


Ver Perfil
Re: Funcion equivalente en C
« Respuesta #2 en: 23 Mayo 2017, 21:59 »

RGB To Gray es una función que convierte un byte (o un array de bytes procedente de una imagen), a gris...

el gris, como sabrás tiene un solo canal (8bits), pero si se amplía a 3 canales (24 bits), lo que se hace es repetir ese valor en los 3 canales.

Sea el color hexadecimal: FF54AB. Bueno, pués lo primero es decomponer el valor de 32 bits en los 3 canales sueltos, para tener los valores individuales de cada canal:

Código:
Valor = Valor and 16777215 // borramso un posible valor sobre el canal alfa.
Rojo= (Valor and 255)
Verde = ((Valor\256) and 255)
Azul = ((Valor\65536) )
Ya tenemos cada valor de canal suelto, ahora podemos recurrir a dos modos, el más rápido es sumar y dividir entre 3, es decir concedemos la misma importancia a cada canal (esto es más rápido pero puede no ser muy preciso)

Código:
Gris = ((rojo + verde + azul) \3)
//             azul                verde       rojo
Valor = ((Gris * 65536) or (Gris * 256) or Gris)

Puedes usar la fórmula más lenta de usar parcialmente cada valor en partes no iguales (LUMA):
Código:

Gris = ((Azul * 0.11) + (Verde * 0.59) + (Rojo * 0.3)) //  0'11+0'59+0'3=1'00
//             azul                verde       rojo
Valor = ((Gris * 65536) or (Gris * 256) or Gris)

Entonces la función pelada, queda así:
Código:
Funcion RGBaGrisLUMA(valor)
    Rojo= (Valor and 255)
    Verde = ((Valor\256) and 255)
    Azul = ((Valor\65536) and 255) // borramos un posible valor sobre el canal alfa.

    Gris = ((Azul * 0.11) + (Verde * 0.59) + (Rojo * 0.3))
    Valor = ((Gris * 65536) or (Gris * 256) or Gris)
Fin Funcion

// La versión rápida: Prueba ambas, a veces no se nota demasiada diferencia de calidad.
Código:
Funcion RGBaGris(valor)
    Rojo= (Valor and 255)
    Verde = ((Valor\256) and 255)
    Azul = ((Valor\65536) and 255) // borramos un posible valor sobre el canal alfa.

    Gris = ((Azul + Verde + Rojo) \ 3)
    Valor = ((Gris * 65536) or (Gris * 256) or Gris)
Fin Funcion

Se admiten ligeras variaciaciones sobre los coeficientes de LUMA, pero lo que no varía es que la suma de los 3 deber ser siempre igual a 1.

NOTA: Si se hacen desplazamientos, en vez de divisiones y multiplicaciones ( >>, <<), las operaciones serán mucho más rápido.
« Última modificación: 23 Mayo 2017, 22:09 por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
equivalente
Hacking Linux/Unix
octalh 6 2,727 Último mensaje 13 Junio 2006, 02:28
por octalh
Equivalente de funcion REPLACE de vb en C ?
Programación C/C++
User 5 1,350 Último mensaje 25 Julio 2012, 01:07
por User
llamar funcion equivalente a shell desde window mobile
.NET
sysfactory 1 799 Último mensaje 18 Julio 2013, 06:14
por Eleкtro
Función equivalente a QueryFullProcessImageName para win XP
Programación C/C++
el_doctor 7 1,024 Último mensaje 1 Diciembre 2014, 18:52
por Eternal Idol
Escribir funcion equivalente en C
Programación C/C++
Kougami 8 390 Último mensaje 24 Mayo 2017, 21:28
por NEBIRE
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines