Buenas, escribia porque no se como sacar una funcion equivalente en C del siguiente codigo escrito en asm:
.global rgb2gray
.equ COEF1, 3483
.equ COEF2, 11718
.equ COEF3, 1183
.text
rgb2gray:
ldr r3, =COEF1
mul r0, r3, r0
ldr r3, =COEF2
mla r0, r3, r1, r0
ldr r3, =COEF3
mla r0, r3, r2, r0
mov r0, r0, lsr #14
mov pc, lr
Si me pudieseis ayudar estaria genial.
Muchas gracias de antemano
¿Sabes que hace cada instrucción?
Mas o menos,
Se que ldr guarda en R3 los distintos coeficicentes, y luego que mul hace una multiplicacion, mla no se lo que hace y luego mov r0, r0, lsr #14 no se lo que hace y finalmente el mov pc, lr es el epilogo de la subrutina
¿Es para la universidad? Tenéis que aprender a documentaros, el mundo laboral es muy chungo.
Yo he encontrado este enlace. Rápidamente he podido reconstruir la rutina en C.
http://www.keil.com/support/man/docs/armasm/armasm_dom1361289878324.htm
A ver si lo consigues a partir de esto.
No, no es para la universidad, sino para el instituto.
Gracias por el enlace, creo que lo tengo traducido, no hay ningun tipo de bucle ni nada no?
Es lineal.
¿Cuál es la asignatura?
TICO, Tecnologias de la informacion y la comunicacion
Dos cosas, la funcion en C es un void?? Y luego, los coeficientes, como son un .equ son constantes cuyo valor es el numero de al lado tal cual no?
En el ensamblador el resultado se queda en r0 y cuando regresa el valor seguirá en ese registro. Por tanto en C deberás regresar ese resultado.
Por si no entiendes mucho inglés:
la instrucción mla
mla regreso, multiplicando 1, multiplicando 2, sumando
deja en regreso el resultado de multiplicar multiplicando1 y multiplicando2 y, posteriormente añadir sumando
lsr, en ese contexto, desplazará hacia la derecha el contenido del registro de la instrucción mov tantos bits como se indique.
Vaya, has duplicado tu mensaje, en vez de pedir que movieran tu hilo...
El caso es que ya te respondí ayer en aquel hilo:
https://foro.elhacker.net/asm/funcion_equivalente_en_c-t469877.0.html