arm_inst_mul
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
arm_inst_mul [2020/05/18 01:44] – mariano | arm_inst_mul [2020/11/20 22:30] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== Instrucciones de multiplicación, | + | ====== Instrucciones de multiplicación, |
- | + | ||
- | ==== mul ==== | + | |
Las instrucciones de multiplicación admiten muchas posibilidades, | Las instrucciones de multiplicación admiten muchas posibilidades, | ||
Línea 9: | Línea 7: | ||
| umull | 64=32x32 | | umull | 64=32x32 | ||
| smull | 64=32x32 | | smull | 64=32x32 | ||
- | | smulw♦ | 32=32x16 | + | | smulw< |
- | | smulw♦♦ | + | | smul< |
+ | |||
+ | ==== mul ==== | ||
La instrucción **mul** realiza una multiplicación truncada, es decir, nos quedamos con los 32 bits inferiores del resultado. Como el signo del resultado es el bit más significativo el cual no obtenemos, esta multiplicación es válida tanto para operandos naturales (sin signo) como para enteros (con signo). | La instrucción **mul** realiza una multiplicación truncada, es decir, nos quedamos con los 32 bits inferiores del resultado. Como el signo del resultado es el bit más significativo el cual no obtenemos, esta multiplicación es válida tanto para operandos naturales (sin signo) como para enteros (con signo). | ||
+ | |||
+ | Sintaxis | ||
+ | |||
+ | | ||
+ | |||
En el ejemplo de abajo **r0 = parte_baja(r1*r2)**: | En el ejemplo de abajo **r0 = parte_baja(r1*r2)**: | ||
mul r0, r1, r2 | mul r0, r1, r2 | ||
+ | |||
+ | |||
+ | ==== umull y smull==== | ||
Las dos siguientes multiplicaciones (umull y smull) son largas, por eso la **l** del final, donde el resultado es de 64 bits. Si los operandos son naturales escogemos la multiplicación sin signo (unsigned) umull. Por el contrario, si tenemos dos enteros como factores hablamos de multiplicación con signo (signed) smull. | Las dos siguientes multiplicaciones (umull y smull) son largas, por eso la **l** del final, donde el resultado es de 64 bits. Si los operandos son naturales escogemos la multiplicación sin signo (unsigned) umull. Por el contrario, si tenemos dos enteros como factores hablamos de multiplicación con signo (signed) smull. | ||
+ | |||
+ | Sintaxis | ||
+ | | ||
+ | |||
+ | Donde: | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | |||
En ambos ejemplos la parte baja del resultado se almacena en **r0**, y la parte alta en **r1**. | En ambos ejemplos la parte baja del resultado se almacena en **r0**, y la parte alta en **r1**. | ||
+ | |||
Para hacer que **r1:r0 = r2*r3:** | Para hacer que **r1:r0 = r2*r3:** | ||
Línea 27: | Línea 46: | ||
smull r0, r1, r2, r3 | smull r0, r1, r2, r3 | ||
- | Ahora veamos **smulw♦ **. Es con signo, y el ♦ puede ser una b para seleccionar la parte baja del registro del segundo factor, o una t para seleccionar la alta. | + | ==== smulw< |
+ | |||
+ | Ahora veamos **smulw< | ||
+ | |||
+ | Sintaxis: | ||
+ | | ||
+ | |||
+ | Donde | ||
+ | |||
+ | <y> Especifica que mitad del registro <Rs> es usada como operando para multiplicar. | ||
+ | |||
+ | Si <y> es B, la parte más baja (bits[15: | ||
+ | |||
+ | Si <y> is T, la parte más alta (bits[31: | ||
Según el ejemplo **r0 = r1*parte_baja(r2)**. | Según el ejemplo **r0 = r1*parte_baja(r2)**. | ||
Línea 33: | Línea 66: | ||
| | ||
- | Por último tenemos smul♦♦ | + | |
+ | ==== smul< | ||
+ | |||
+ | Por último tenemos smul< | ||
+ | |||
+ | Sintaxis | ||
+ | | ||
+ | |||
+ | Donde | ||
+ | |||
+ | <x> Especifica que mitad del registro <Rm> es usada como primer operando de la multiplicación. | ||
+ | |||
+ | Si <x> es B, la parte más baja (bits[15: | ||
+ | |||
+ | Si <x> es T, la parte más alta (bits[31: | ||
+ | |||
+ | <y> Especifica que mitad del registro <Rs> es usada como segundo operando para la multiplicación. | ||
+ | |||
+ | Si <y> es B, la parte más baja (bits[15: | ||
+ | |||
+ | Si <y> es T, la parte más alta (bits[31: | ||
En el ejemplo **r0 =parte_alta(r1)*parte_baja(r2)**. | En el ejemplo **r0 =parte_alta(r1)*parte_baja(r2)**. | ||
Línea 39: | Línea 93: | ||
| | ||
- | En los dos últimos tipos smulw♦ y smul♦♦ | + | En los dos últimos tipos smulw< |
Ejercicio: 8-O | Ejercicio: 8-O | ||
Línea 51: | Línea 105: | ||
| smultt | | smultt | ||
- | .data | + | |
- | | + | |
- | | + | |
- | var3 : .word 0x00012345 | + | |
- | @ | + | |
- | | + | |
- | | + | main : |
- | main : | + | |
- | | + | |
- | | + | |
- | ldr r2, = var3 | + | ldr r3, [r0] |
- | ldrh r3, [r0] /* r3 <- baja (* r0) */ | + | ldr r4, [r1] |
- | ldrh r4, [r1] /* r4 <- baja (* r1) */ | + | smulbb |
- | muls r5, r3, r4 /* r5 <- r3*r4 */ | + | /* r5=0x2468642 */ |
- | ldr r3, [r0] /* r3 <- *r0 */ | + | // |
- | ldr r4, [r1] /* r4 <- *r1 */ | + | |
- | umull r5, r6, r3, r4 /* r6:r5 <- r3*r4 */ | + | ldrh r4, [r1] /* r4 <- baja(var2) |
- | smull r5, r6, r3, r4 | + | muls r5, r3, r4 /* r5 <- baja(var1)*baja (var2) |
- | ldrh r3, [r0] /* r3 <- baja (* r0) */ | + | /* r5=0x2468642 |
- | | + | |
- | smulwb | + | |
- | smultt | + | |
+ | umull r5, r6, r3, r4 | ||
+ | smull r5, r6, r3, r4 | ||
+ | fin: | ||
+ | mov r7, #1 | ||
+ | swi 0 | ||
- | ==== División | + | |
+ | ==== división | ||
No existe la operación/ | No existe la operación/ | ||
- | Desarrollaremos un programa en código ensamblador | + | |
+ | Desarrollaremos un programa en código ensamblador ARM que divida dos números tamaño **word A y B** y escribiremos el resultado en el número **C** mediante restas utilizando el algoritmo de abajo. | ||
| | ||
+ | '' | ||
+ | |||
+ | C = 0 | ||
+ | | ||
+ | { | ||
+ | A = A - B | ||
+ | C = C + 1 | ||
+ | } | ||
+ | |||
+ | La ausencia de una instrucción de división se debe a que ARMv6 es una arquitectura RISC, y en este tipo de arquitecturas las intrucciones deben ser simples de tal forma de poder ejecutarse en un solo ciclo de instrucción. | ||
+ | |||
+ | De todos modos, la arquitectura ARM se puede extender con el coprocesador de punto flotante llamado VFP (Vector Floating-Point). La arquitectura de este coprocesador admite instrucciones de división en punto flotante, pero nosotros no estudiaremos esta extensión. | ||
+ | |||
+ | |||
---- | ---- | ||
+ | [[: | ||
~~NOCACHE~~ | ~~NOCACHE~~ |
×
iphelper toolbox
you see this when javscript or css is not working correct
Untested
arm_inst_mul.1589766284.txt.gz · Última modificación: 2020/05/18 01:44 por mariano